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

Posted

技术标签:

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

我正在尝试(Big-endian)。

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

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

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

提前感谢您的帮助。

【问题讨论】:

符号和大小?二进制补码? 它是二进制补码 【参考方案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);

【讨论】:

以上是关于在 C# 中将 3 个字节转换为有符号整数的主要内容,如果未能解决你的问题,请参考以下文章

将 8 个字节转换为有符号长整数(64 位)

在 C# 中将 2 个字节转换为 Short

C# char*如何转换string

如何在C#中将字节转换为字符串[重复]

将小端序列中的4个字节转换为无符号整数

在c#中将字符串转换为字节数组