将BYTE数组转换为INT

20

我有这样的代码

static void Main(string[] args)
{
     byte[] array = new byte[2] { 0x00, 0x1f };
     Console.WriteLine(BitConverter.ToInt32(array, 0));
}

然而,它并没有起作用。 它抛出了一个异常:

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

问题出在哪里?

4个回答

22

如其名,Int32是32位或4字节,因此如果您想将一个字节数组转换为Int32,它至少需要有4个字节的长度(更精确地说,它需要在起始位置之后至少有4个字节)。

如果您只有两个字节,也许您想使用ToInt16


11

Int32由4个字节组成,但数组只有2个。解决方法之一是先转换为Int16,然后再转换为Int32

Console.WriteLine((Int32)(BitConverter.ToInt16(array, 0)));
请注意,在此特定用法中,从 Int16 转换为 Int32 不会改变任何内容,因为数字打印出来相同。

1
就像将十进制数“10”写成“0010”一样,不会改变其他任何东西:额外的零是无意义的。当你将Int16转换为Int32时,你更多地是在做同样的事情。 - Andrejovich
FYI,Visual Studio 2022 使用 .Net 6 表示 Int32 转换是多余的。 - computercarguy

6

这是一个老问题,但对于.NET Core/.NET Standard > 2.1,有新的解决方案:

System.Buffers.Binary.BinaryPrimitives提供了两个静态方法ReadInt32BigEndianReadInt32LittleEndian,用于此目的。

使用这些方法有两个优点:

  1. 它允许您显式指定您的数字是存储为little endian或big endian
  2. 它们接受Span<T>,这可能是性能上的优势,具体取决于情况。

4
BitConverter.ToInt32的文档显示:
ToInt32方法将从startIndex到startIndex + 3索引处的字节转换为Int32值。
您需要指定至少4个字节,但您只有2个字节。

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