我有这种代码
static void Main(string[] args)
{
byte[] array = new byte[2] { 0x00, 0x1f };
Console.WriteLine(BitConverter.ToInt32(array, 0));
}
然而它不起作用。它引发了一个例外:
目标数组不够长,无法复制中的所有项目 采集。检查数组索引和长度。
有什么问题?
答案 0 :(得分:14)
顾名思义,Int32
是32位或4个字节,因此如果要将字节数组转换为Int32
,则需要长度至少为4, (或者更确切地说,它需要在起始位置后至少有4个字节)。
如果您只有两个字节,那么您可能想要使用ToInt16
?
答案 1 :(得分:7)
Int32
由4个字节组成,但数组只有2个。解决此问题的方法之一是首先转换为Int16
然后转换为Int32
Console.WriteLine((Int32)(BitConverter.ToInt16(array, 0)));
请注意,在此特定用法中,从Int32
转换为Int16
不会改变任何内容,因为数字打印相同。
答案 2 :(得分:4)
BitConverter.ToInt32
上的documentation说:
ToInt32方法将索引startIndex到startIndex + 3的字节转换为Int32值。
您需要指定至少4个字节,但只有2个。
答案 3 :(得分:1)
这是一个古老的问题,但是对于.NET Core / .NET Standard> 2.1,有一个新的解决方案:
System.Buffers.Binary.BinaryPrimitives
class为此提供了两个静态方法ReadInt32BigEndian
和ReadInt32LittleEndian
。
使用这些方法有两个优点:
Span<T>
可能是性能上的优势。