不知怎的,我有一个脑筋,无法找出适当的大端和小端表示法。我有一个字节流,其中存储了32位整数。
整数是1000十进制,即0x03E8十六进制。在Little Endian中,当表示为两个字节时,它将被存储为E8 03
。
我假设如果我想要4字节填充,它将被存储为00 00 E8 03
。但是,当我使用BitConverter时,我得到了奇怪的结果:
// true
Console.WriteLine(BitConverter.IsLittleEndian);
var bytes = new byte[4] { 0x00, 0x00, 0xE8, 0x03 };
var convertedInt = BitConverter.ToInt32(bytes,0);
// 65536000 ?!
Console.WriteLine(convertedInt);
var inputInt = 1000;
var convertedBytes = BitConverter.GetBytes(inputInt);
// 4 Bytes: e8 03 00 00
Console.WriteLine("{0} Bytes: {1:x2} {2:x2} {3:x2} {4:x2}", convertedBytes.Length,
convertedBytes[0], convertedBytes[1],
convertedBytes[2], convertedBytes[3]);
这看起来像BitConverter坏了。 The documentation清楚地说:
GetBytes方法返回的数组中的字节顺序取决于计算机体系结构是小端还是大端。
那么,我是否误解了Little Endian是如何工作的,是BitConverter破坏了,还是我做错了什么?
答案 0 :(得分:5)
所以,我误解了Little Endian的工作原理
烨。 Little endian意味着最不重要的部分首先出现 - 所以1000实际上是
Little endian: E8 03 00 00
Big endian: 00 00 03 E8
该数字的最低有效字节是E8,所以肯定它应该在一个结束或另一个 - little-endian表示将它放在开头; big-endian表示将它放在最后。您建议的00 00 E8 03
表示将其放在中间位置。根据{{3}},这种表示确实存在,但很少 - 这被称为混合端或中端。
确认代码:
using System;
class Test
{
static void Main()
{
var bytes = new byte[4] { 0xE8, 0x03, 0x00, 0x00 };
var convertedInt = BitConverter.ToInt32(bytes, 0);
Console.WriteLine(convertedInt); // 1000
}
}