C#BinaryWriter - 和endianness

Edd*_*Lin 11 c# endianness binarywriter

我在我的代码中使用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();
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

在此输入图像描述

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

gio*_*gim 12

虽然是1024 0x0400.当把它存储在文件或内存中时,我们应该使用little endian或big endian表示法来提问吗?

在这种情况下BinaryWriter,它是小端.这意味着LSB首先出现 - 然后是MSB.因此,它存储为:

LSB | MSB
00    04
Run Code Online (Sandbox Code Playgroud)

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


xan*_*tos 6

作为旁注,它完全按照msdn中的指定写入文件:

备注

BinaryWriter以little endian格式存储此数据类型.

你要求的是"大端格式".你必须重新实现BinaryWriter这样做.

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

注意

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

最终在英特尔/ AMD PC上,这种差异没有实际意义:英特尔是Little Endian,几乎所有手机都是如此.我知道支持.NET(在特殊版本中)的唯一一个大例外是Xbox360.