从字节数组(蓝牙)解析短

本文关键字:蓝牙 字节 字节数 数组 | 更新日期: 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 类支持将字节数组转换为各种类型,并支持源自任一字节序的数据。