通常,如果您想在字节数组中表示5,它应该是{0x00,0x00,0x00,0x05}。但是BitConverter却给了我一个反过来的数组({0x05,0x00,0x00,0x00}),这是为什么?我错在哪里了?
通常,如果您想在字节数组中表示5,它应该是{0x00,0x00,0x00,0x05}。但是BitConverter却给了我一个反过来的数组({0x05,0x00,0x00,0x00}),这是为什么?我错在哪里了?
很可能你的计算机采用的是小端序架构(x86和x86-64常见采用此种架构)。你可以通过使用BitConverter.IsLittleEndian
属性进行验证。
在这种架构中,最不重要的字节排在最前面,这也解释了为什么
BitConverter.GetBytes(5)
产生
{ 0x05, 0x00, 0x00, 0x00 }
如果需要根据系统/目标字节顺序,您当然可以反转数组。您可以在此处找到名为 EndianBitConverter
的工具类的代码:这里。
我编写了以下包装类来处理 BitConverter
期望 Little Endien 的情况。
public static Int16 ToInt16(byte[] data, int offset)
{
if (BitConverter.IsLittleEndian)
{
return BitConverter.ToInt16(BitConverter.IsLittleEndian ? data.Skip(offset).Take(2).Reverse().ToArray() : data, 0);
}
return BitConverter.ToInt16(data, offset);
}
public static Int32 ToInt32(byte[] data, int offset)
{
if (BitConverter.IsLittleEndian)
{
return BitConverter.ToInt32(BitConverter.IsLittleEndian ? data.Skip(offset).Take(4).Reverse().ToArray() : data, 0);
}
return BitConverter.ToInt32(data, offset);
}
public static Int64 ToInt64(byte[] data, int offset)
{
if (BitConverter.IsLittleEndian)
{
return BitConverter.ToInt64(BitConverter.IsLittleEndian ? data.Skip(offset).Take(8).Reverse().ToArray() : data, 0);
}
return BitConverter.ToInt64(data, offset);
}