在C#中将3个字节转换为有符号整数

时间:2011-11-12 12:07:34

标签: c# bytearray int byte

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

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

有人可以建议我怎样才能以不同的方式做到这一点?

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

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:9)

作为最后的手段,你总是可以转移+添加自己:

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

答案 1 :(得分:4)

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

要知道你应该传递什么,你可以尝试转换它:

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

答案 2 :(得分:0)

要在此处添加现有答案,如果数组的大小小于Bitconverter.ToInt32()(4)字节,那么ArgumentException会抛出sizseof(int),这有点麻烦;

  

目标数组不够长,无法复制集合中的所有项目。检查数组索引和长度。

给定一个小于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);