【问题标题】:How do you convert 3 bytes into a 24 bit number in C#?如何在 C# 中将 3 个字节转换为 24 位数字?
【发布时间】:2010-07-27 16:03:44
【问题描述】:

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

var data = new byte[] { 39, 213, 2 };

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

【问题讨论】:

标签: c#


【解决方案1】:
var num = data[0] + (data[1] << 8) + (data[2] << 16);

【讨论】:

  • 我相信这里有一个重要的注意事项是此代码仅适用于无符号整数。这是一个有效的响应,因为字节包含长度(我们可以假设它是一个无符号整数)。
  • @Crimson - 等等...你的意思是消息通常没有负长度? :)
  • 非常正确:-)。对于有符号整数,正如 LukeH 建议的那样,您可以参考这个问题:stackoverflow.com/questions/3322788/…
【解决方案2】:

使用 BitConverter.ToInt32 之类的方法,但要意识到 32 位数量需要 4 个字节。

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

还有other methods 可以转换为其他类型,如Single 和Double。

【讨论】:

  • 糟糕,忘记了。他们真的拥有一切,不是吗?
  • 在给定的例子中会崩溃,因为它需要四个字节
  • 这是一场与西部最快枪支的比赛;)。我更新了它。我喜欢使用 BitConverter 而不是对转换进行硬编码,以使其更具可读性并清楚代码在做什么。
  • 请注意BitConverter 使用的字节序是平台相关的,而 OP 的数据始终是小字节序。如果您希望它在所有平台上都能正常工作,那么您需要检查 BitConverter.IsLittleEndian 属性并在必要时反转您的 data 数组。
  • 在我看来,BitConverter 的隐藏字节序相对于移位和添加来说是一个严重的劣势——至少在转换时你正在做的事情是明确的。但是我还是一直在用 BitConverter,我该抱怨谁...
【解决方案3】:

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

int d = (data[2] << 16) | (data[1] << 8) | data[0]

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

【讨论】:

    【解决方案4】:

    这样的事情应该可以工作:

    data[0] + 256*data[1] + 256*256*data[2]
    

    您的编译器应该针对“正确的”位旋转操作进行优化。

    【讨论】:

      【解决方案5】:

      BitConverter 为您处理字节顺序,这就是为什么要走的路。

      虽然你需要 4 个字节,但是

      BitConverter.ToInt32(new byte[1] { 0 }.Concat(yourThreeByteArray).ToArray());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        相关资源
        最近更新 更多