【问题标题】:How do I add 3 bytes and return an integer number?如何添加 3 个字节并返回一个整数?
【发布时间】:2013-05-10 22:27:26
【问题描述】:

假设我有一个十六进制字符串

00 00 04 01 11 00 08 00 06 C2 C1 BC

有了这个第 7、第 8 和第 9 个八位字节是我需要生成的数字。十六进制是

00 06 C2

这个数字原来是1730。有了以下内容,我该如何简化呢?

byte b1 = 0x00;
byte b2 = 0x06;
byte b3 = 0xC2;

Console.WriteLine(Convert.ToInt32((Convert.ToString(b1, 16)) + (Convert.ToString(b2, 16)) + (Convert.ToString(b3, 16)), 16));

我知道必须有更简单的方法。我试过Console.WriteLine((b1 + b2 + b3).ToString());,但它不起作用。

【问题讨论】:

    标签: c# int byte int32


    【解决方案1】:

    你可以试试这个:

        byte b1 = (byte)0x00;
        byte b2 = (byte)0x06;
        byte b3 = (byte)0xC2;
        int i = ((b1 & 0xFF) << 16) | ((b2 & 0xFF) << 8) | (b3 & 0xFF);
    

    编辑:

        byte b1 = (byte)0x00;
        byte b2 = (byte)0x06;
        byte b3 = (byte)0xC2;
        int i = (b1 << 16) | (b2 << 8) | b3;
    

    【讨论】:

    • 我看到了那个偷偷摸摸的编辑;)注意:如果你知道源是byte,那么&amp; 0xFF 没有任何好处——没有其他可以设置的位
    【解决方案2】:

    试试:

    int result = b3 | (b2 << 8) | (b1 << 16);
    

    假设 b1、b2 和 b3 是您需要转换的 byte 值。

    &lt;&lt; operator 将其操作数左移指定的位数。

    【讨论】:

    • 这很完美!我会尽快将其标记为答案!
    • 作为一个小提示:在处理byte 算术时,|+ 更可取;当涉及“负”数时(设置了 MSB),这可能很重要
    • (OP 将+ => | 作为建议的编辑...随时将其改回,但我认为| 改进了答案)
    • 我只是将 + 更改为 |但它需要我更改 6 个字符才能进行编辑,所以我在最后添加了一条评论。
    • @MarcGravell True dat - 我不太担心,因为它只有 3 个字节(所以+ 总是有效的),但最好以正确的方式进行。
    【解决方案3】:

    您可以使用 BitConverter 类将字节数组转换为 int。

    // Add the bytes to an array, starting with b3, then b2, b1 and 0 to
    // make it 4 bytes in total.
    byte[] b = new byte[] { 0xC2, 0x06, 0x00, 0x00 };
    int i = BitConverter.ToInt32(b, 0);
    

    i 现在将具有值1730

    【讨论】:

    • 不过,这是一种相当困难的方法来做一些相当简单的事情 - 它会引发关于“字节顺序”等的各种问题。我会工作,但要正确完成,你需要检查BitConverter.IsLittleEndian
    • 是的,我意识到这一点,但不想让它变得比现在更复杂。我更喜欢移位方式,但想提出其他答案的替代方案。
    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 2015-05-31
    • 2016-09-16
    • 2021-09-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多