如何在C#中将3个字节转换为24位数?

leg*_*ion 5 c#

我有一个字节数组,我从消息的标题部分读取.这些字节包含消息的长度.从不超过3个字节,它们从LSB到MSB排序.所以在下面的例子中,39是LSB,2是MSB.

var data = new byte[] { 39, 213, 2 };
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我如何获取这些字节并转换为数字(int,short等)?

Cha*_*ion 14

var num = data[0] + (data[1] << 8) + (data[2] << 16);
Run Code Online (Sandbox Code Playgroud)

  • 我相信这里的一个重要注意事项是,此代码仅适用于无符号整数.这是一个有效的响应,因为字节包含长度(我们可以假设它是unsigned int). (4认同)

Jef*_*ser 8

使用像BitConverter.ToInt32这样的方法,但是要意识到32位数量需要4个字节.

var data = new byte[] {39, 213, 2, 0};
int integer = BitConverter.ToInt32(data, 0);
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以转换为其他类型,如Single和Double.

  • 请注意,"BitConverter"使用的字节序依赖于平台,而OP的数据总是小端的.如果你想让它在所有平台上正常工作,你需要检查`BitConverter.IsLittleEndian`属性并在必要时反转你的`data`数组. (4认同)
  • 在我看来,BitConverter的隐藏字符串在转移和添加方面是一个严重的缺点 - 至少它在你正在做的转换点是明确的.但我仍然一直使用BitConverter,所以我该抱怨谁... (3认同)
  • 这将在给定的示例中崩溃,因为它需要四个字节 (2认同)
  • 这是对阵西部最快的枪支的比赛;).我更新了它.我喜欢使用BitConverter和硬编码转换,以使其更具可读性并清楚代码正在做什么. (2认同)

cwa*_*wap 5

使用左移运算符和或运算符:

int d = (data[2] << 16) | (data[1] << 8) | data[0]
Run Code Online (Sandbox Code Playgroud)

显然,你可以在这里做各种各样的事情,比如使用循环等:)