2012-11-29 66 views
0

我想傳輸一個APDU,然後我得到響應。我想通過API記錄比較的最後兩個字節。如何在C#中使用索引傳遞字節數組的子串?

byte[] response = Transmit(apdu); 

//response here comes will be 0x00 0x01 0x02 0x03 0x04 
//response.Length will be 5 


byte[] expectedResponse = { 0x03, 0x04 }; 

int index = (response.Length)-2; 

Log.CheckLastTwoBytes(response[index],expectedResponse); 

//The declaration of CheckLastTwoBytes is 
//public static void CheckLastTwoBytes(byte[] Response, byte[] ExpResp) 

這是無效參數的錯誤。我怎樣才能將最後2個字節傳遞給API?

+0

其實我想知道,如果有可能使用索引傳遞子串而不使用臨時數組。 (就像我們可以在C中做的那樣) – SHRI

+1

不用C#,很遺憾地說。 –

+1

ArraySegment是一種引用數組的片段而不復制它的副本的方法 – gordy

回答

1
new ArraySegment<byte>(response, response.Length - 2, 2).Array 

編輯:請不要介意這一點,顯然.Array只是返回原來的整個陣列不是切片。你將不得不修改其他的方法來接受,而不是字節ArraySegment []

2

使用Array.Copy

byte[] newArray = new byte[2]; 
Array.Copy(response, response.Length-2, newArray, 2); 
Log.CheckLastTwoBytes(newArray,expectedResponse); 
+0

或者...您可以只有兩個任務?這只是兩個字節。實際上不需要Array.Copy ... – SimpleVar

+0

是的,Array.Copy可以替換爲2個賦值。 – Tilak

0

,或者,你可以使用LINQ:

byte[] lastTwoBytes = response.Skip(response.Length-2).Take(2).ToArray(); 
1

由於response[index]類型爲bytebyte[]),這並不奇怪,你會得到那個錯誤。

如果Log.CheckLastTwoBytes確實檢查只是其Response參數的最後兩個字節,那麼你應該只是傳遞response

Log.CheckLastTwoBytes(response, expectedResponse) 
1

你不能有一個子陣就這樣,不...

首先解決方案,明顯的:

var tmp = new byte[] { response[response.Length - 2], 
         response[response.Length - 1] }; 

Log.CheckLastTwoBytes(tmp, expectedResponse); 

或者,你可以這樣做:

response[0] = response[response.Length - 2]; 
response[1] = response[response.Length - 1]; 

Log.CheckLastTwoBytes(response, expectedResponse); 

這可能是這個函數不檢查精確長度,等等,所以你可以只是把最後兩個字節作爲前兩個,如果你不」不在乎關於銷燬數據。

相關問題