C# BinaryWriter - 和字节顺序

C# BinaryWriter - and endianness

我在我的代码中使用 BinaryWriter,这是我的代码:

static void Main(string[] args)
{
    FileInfo file = new FileInfo(@"F:\testfile");
    if (file.Exists) file.Delete();
    using (BinaryWriter bw = new BinaryWriter(file.Create()))
    {
        ushort a = 1024;
        ushort b = 2048;
        bw.Write(a);
        bw.Write(b);
        bw.Write(a);
        bw.Write(b);
    }
    Console.ReadLine();
}

但是输出文件的十六进制是:

那不是0x0004 = 4吗?为什么?

虽然 1024 是 0x0400。在将其存储在文件或内存中时, 问题来了,我们应该使用小端还是大端表示法?

如果是BinaryWriter,则为小端。这意味着 LSB 先行 - 然后是 MSB。 因此,它存储为:

LSB | MSB
00    04

您可以阅读有关字节顺序的更多信息。

如果我没记错的话,在显示中输出的字节顺序与您的期望相反。尽管 1024 的十六进制表示形式是 0400,但它可能存储为 0004,具体取决于编码或平台的字节顺序。

作为旁注,它写入文件完全,因为它在msdn:

中指定

Remarks

BinaryWriter stores this data type in little endian format.

您要求的是“大端格式”。您必须重新实现 BinaryWriter 才能做到这一点。

请注意 BinaryWriterBitConverter 的行为不同。 BinaryWriter 是“总是小端”,而 BitConverter.GetBytes(ushort) (这是一个完全不同的函数,但有一个“共同”连接:将数字转换为字节)是“本地端”(所以它使用计算机的字节序)

Note

The order of bytes in the array returned by the GetBytes method depends on whether the computer architecture is little-endian or big-endian.

最后,在 Intel/AMD 个人电脑上,这种差异没有实际意义:英特尔是小端法,几乎所有手机也是如此。据我所知,唯一支持 .NET(特殊版本)的大例外是 Xbox360。