解析短字节数组(蓝牙)

问题描述:

我正在解析一些使用蓝牙发送的数据包,并且我使用了以前用于解析TCP数据包的相同代码,不管怎样,即使字节数组被正确接收,分析时值不同。解析短字节数组(蓝牙)

这是PrintByteArray打印:

字节[] {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 

我不知道我在做什么错,一切看起来都很好。

+0

'int commandType = System.Net.IPAddress.NetworkToHostOrder((Int16)BitConverter.ToInt16(data,0));'' – Eser

它看起来像你收到的字节数组是编码Big Endian而不是Little Endian。

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

BitConverter类支持将字节数组转换为各种类型,并且支持源自Endianness的数据。

BitConverter使用机器的字节顺序(通常是窗口小端)。您收到的数据是大端。您可以使用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; 
}