从字节数组(蓝牙)解析短
本文关键字:蓝牙 字节 字节数 数组 | 更新日期: 2023-09-27 18:34:28
我正在解析一些使用蓝牙发送的数据包,并且我使用了以前用于解析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
我不确定我做错了什么,一切看起来都很好。
BitConverter 使用机器的字节序(通常是窗口的小端序(。您接收的数据采用大字节序。您可以使用 IPAddress.NetworkToHostOrder 正确读取数据。
这是您的代码,其中包含从大端序转换为小端序的帮助程序。
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, 0, 4, 0, ...},则在解析数据时将获得预期的结果。
BitConverter 类支持将字节数组转换为各种类型,并支持源自任一字节序的数据。