4

不知何故,我脑子有问题,无法弄清楚正确的大端和小端表示。我有一个存储 32 位整数的字节流。

Integer 是十进制的 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 坏了。文档清楚地说:

GetBytes 方法返回的数组中的字节顺序取决于计算机体系结构是 little-endian 还是 big-endian。

那么,我是否误解了 Little Endian 的工作原理,BitConverter 是否损坏,或者我做错了什么?

4

1 回答 1

7

那么,我是否误解了 Little Endian 的工作原理

是的。Little endian 意味着最不重要的部分首先出现 - 所以 1000 实际上是

Little endian: E8 03 00 00
Big endian:    00 00 03 E8

数字的最低有效字节是 E8,所以它肯定应该放在一端或另一端 - 小端表示将它放在开头;big-endian 表示将其放在最后。您建议的表示00 00 E8 03将其放在中间。根据Wikipedia Endianness page,这种表示确实存在,但很少见 - 这称为混合端或中间端。

确认代码:

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
    }
}
于 2012-12-06T07:53:30.270 回答