从字节数组解析(蓝牙)

时间:2016-02-13 00:24:28

标签: c# tcp bluetooth

我正在解析使用蓝牙发送的一些数据包,我使用了之前用来解析TCP数据包的相同代码,不管怎样,即使字节数组被正确接收,短值也不同解析。

这是PrintByteArray打印的内容:

  

byte [] {0,1,0,4,0,0,0,1,66,112,0,1,...}

PrintByteArray(data);

int commandType = (int)BitConverter.ToInt16(data, 0);
int payloadSize = (int)BitConverter.ToInt16(data, 2);

Debug.WriteLine(commandType); // prints 256 instead of 1
Debug.WriteLine(payloadSize); // prints 1024 instead of 4

我不确定我做错了什么,一切都很好。

2 个答案:

答案 0 :(得分:2)

BitConverter使用机器的字节序(通常用于窗口的小端)。您收到的数据是big endian。您可以使用IPAddress.NetworkToHostOrder正确读取数据。

以下是您的代码,其中包含从Big Endian转换为Little Endian的帮助程序。

PrintByteArray(data);

int commandType = (int)BigToLittleEndian(BitConverter.ToInt16(data, 0));
int payloadSize = (int)BigToLittleEndian(BitConverter.ToInt16(data, 2));

Debug.WriteLine(commandType); // prints 256 instead of 1
Debug.WriteLine(payloadSize); // prints 1024 instead of 4


static short BigToLittleEndian(short value)
{
    return BitConverter.IsLittleEndian ? System.Net.IPAddress.NetworkToHostOrder(value) : value;
}

答案 1 :(得分:1)

您接收的字节数组看起来像是Big Endian而不是Little Endian。

如果将字节顺序交换为{1,0,4,0,...},您将获得解析数据时所期望的结果。

BitConverter类支持将字节数组转换为各种类型,并支持以Endianness为原点的数据。