【问题标题】:Converting 3 bytes into signed integer in C#在 C# 中将 3 个字节转换为有符号整数
【发布时间】:2011-12-27 14:35:57
【问题描述】:

我正在尝试在 C# 中将 3 个字节转换为有符号整数(Big-endian)。

我尝试使用BitConverter.ToInt32 方法,但我的问题是lats 字节应该有什么值。

谁能建议我如何以不同的方式做到这一点?

我还需要将 5(或 6 或 7)个字节转换为有符号长,有什么通用的规则怎么做吗?

提前感谢您的帮助。

【问题讨论】:

  • 符号和大小?二进制补码?
  • 它是二进制补码

标签: c# bytearray int byte


【解决方案1】:

作为最后的手段,你总是可以shift+add自己:

byte b1, b2, b3;

int r = b1 << 16 | b2 << 8 | b3;

只需交换 b1/b2/b3,直到获得所需的结果。

再想一想,这永远不会产生负值。
当 msb >= 0x80 时你想要什么结果?


第 2 部分,蛮力符号扩展:

    private static int Bytes2Int(byte b1, byte b2, byte b3)
    {
        int r = 0;
        byte b0 = 0xff;

        if ((b1 & 0x80) != 0) r |= b0 << 24;
        r |= b1 << 16;
        r |= b2 << 8;
        r |= b3;
        return r;
    }

我已经对此进行了测试:

      byte[] bytes = BitConverter.GetBytes(p);
      int r = Bytes2Int(bytes[2], bytes[1], bytes[0]);
      Console.WriteLine("{0} == {1}", p, r);

为几个p

【讨论】:

  • 好的,谢谢您的帮助。我的最终解决方案有点不同,但我也使用最高有效位 (b1 & 0x80) 的检查机制来确定数字是正数还是负数。
  • @vc.one,是的,感谢您的编辑。 + 还需要 () : (b1 &lt;&lt; 16) + ...
【解决方案2】:

如果未设置为正数,则最后一个值应为 0,负数应为 256。

要知道你应该传入什么,你可以尝试用另一种方式转换它:

var bytes = BitConverter.GetBytes(i);
int x = BitConverter.ToInt32(bytes, 0);

【讨论】:

    【解决方案3】:

    为了在此处添加现有答案,如果数组大小小于 sizseof(int) (4) 字节,Bitconverter.ToInt32() 将抛出 ArgumentException

    目标数组的长度不足以复制集合中的所有项目。检查数组索引和长度。

    给定一个小于sizeof(int) (4) 字节大小的数组,您可以像这样补偿左/右填充;

    右键盘

    产生正的Int32 数字

    int intByteSize = sizeof(int);
    byte[] padded = new byte[intByteSize];
    Array.Copy(sourceBytes, 0, padded, 0, sourceBytes.Length);
    sourceBytes = padded;
    

    左键

    结果为负数 Int32,假设字节索引 sourceBytes.Length - 1 处的值非零。

    int intByteSize = sizeof(int);
    byte[] padded = new byte[intByteSize];
    Array.Copy(sourceBytes, 0, padded, intByteSize - sourceBytes.Length, sourceBytes.Length);
    sourceBytes = padded;
    

    填充后,您可以安全地拨打int myValue = BitConverter.ToInt32(sourceBytes, 0);

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2018-12-01
      • 2012-10-30
      • 2012-02-17
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多