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

本文关键字:带符号 整数 转换 字节 中将 3个 | 更新日期: 2023-09-27 18:14:10

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

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

有人能建议我如何用不同的方式做吗?

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

提前感谢您的帮助。

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

作为最后的手段,您可以随时转移并添加自己:

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

对于几个CCD_ 2。

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

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

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

要添加到这里的现有答案中,如果数组大小小于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;

左焊盘

假定字节索引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);