【发布时间】:2010-07-27 16:03:44
【问题描述】:
我有一个从消息的标题部分读取的字节数组。这些字节包含消息的长度。永远不会超过 3 个字节,它们从 LSB 到 MSB 排序。所以在下面的例子中,39 是 LSB,2 是 MSB。
var data = new byte[] { 39, 213, 2 };
在上面的示例中,我如何获取这些字节并将其转换为数字(int、short 等)?
【问题讨论】:
标签: c#
我有一个从消息的标题部分读取的字节数组。这些字节包含消息的长度。永远不会超过 3 个字节,它们从 LSB 到 MSB 排序。所以在下面的例子中,39 是 LSB,2 是 MSB。
var data = new byte[] { 39, 213, 2 };
在上面的示例中,我如何获取这些字节并将其转换为数字(int、short 等)?
【问题讨论】:
标签: c#
var num = data[0] + (data[1] << 8) + (data[2] << 16);
【讨论】:
使用 BitConverter.ToInt32 之类的方法,但要意识到 32 位数量需要 4 个字节。
var data = new byte[] {39, 213, 2, 0};
int integer = BitConverter.ToInt32(data, 0);
还有other methods 可以转换为其他类型,如Single 和Double。
【讨论】:
BitConverter 使用的字节序是平台相关的,而 OP 的数据始终是小字节序。如果您希望它在所有平台上都能正常工作,那么您需要检查 BitConverter.IsLittleEndian 属性并在必要时反转您的 data 数组。
使用左移运算符和 or 运算符:
int d = (data[2] << 16) | (data[1] << 8) | data[0]
显然,你可以在这里做各种各样的事情,比如使用循环等 :)
【讨论】:
这样的事情应该可以工作:
data[0] + 256*data[1] + 256*256*data[2]
您的编译器应该针对“正确的”位旋转操作进行优化。
【讨论】:
BitConverter 为您处理字节顺序,这就是为什么要走的路。
虽然你需要 4 个字节,但是
BitConverter.ToInt32(new byte[1] { 0 }.Concat(yourThreeByteArray).ToArray());
【讨论】: