如何在C#中使用索引传递字节数组的子字符串?

时间:2012-11-29 03:14:59

标签: c#

我想传输一个APDU,然后我回复了响应。我想通过API检查最后两个字节,这将记录比较。

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?

5 个答案:

答案 0 :(得分:2)

使用Array.Copy

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

答案 1 :(得分:1)

由于response[index]的类型为byte byte[]),因此您会收到该错误并不奇怪。

如果Log.CheckLastTwoBytes确实只检查了其Response参数的最后两个字节,那么您应该只传递response

   Log.CheckLastTwoBytes(response, expectedResponse)

答案 2 :(得分:1)

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

编辑:没关系,显然.Array只返回原始整个数组,而不是切片。您必须修改其他方法以接受ArraySegment而不是byte []

答案 3 :(得分: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);

可能是这个函数没有检查确切的长度等,所以你可以把最后两个字节作为前两个字节,如果你不关心破坏数据。

答案 4 :(得分:0)

或者,您也可以使用linq:

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