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

5
我正在尝试在C#中将3个字节转换为有符号整数(大端序)。
我已经尝试使用BitConverter.ToInt32方法,但我的问题是最后一个字节应该具有什么值。
有人能建议我用不同的方法吗?
我还需要将5(或6或7)个字节转换为有符号长整型,是否有通用规则可以做到这一点?
感谢任何帮助。

1
符号和大小?二进制补码? - Ani
它是以二进制补码表示的。 - Rafal Spacjer
3个回答

9
作为最后的手段,你总是可以使用 shift+add 来添加自己:
byte b1, b2, b3;

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

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

再想一想,这永远不会产生负值。
当最高有效位 >= 0x80时,您想要什么结果?


第二部分,暴力符号扩展:

    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)来确定数字是正数还是负数。 - Rafal Spacjer
@vc.one,是的,感谢您的编辑。+ 也需要 ()(b1 << 16) + ... - H H

4

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

要知道您应该传递什么,可以尝试反向转换:

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

1
为了补充现有的答案,要注意一点,如果数组大小小于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;

Left-pad

在假设字节索引sourceBytes.Length - 1处存在非零值的情况下,会导致负的Int32数字。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接