C# BinaryWriter - 以及字节序问题

15

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

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

enter image description here

enter image description here

难道不应该是0x0004 = 4吗?为什么?

3个回答

14

虽然 1024 等于 0x0400。但是当需要将其存储在文件或内存中时,问题就出现了,我们应该使用小端序还是大端序?

对于 BinaryWriter,它采用小端序。这意味着最低有效位(LSB)先存储,然后是最高有效位(MSB)。因此,它被存储为:

LSB | MSB
00    04

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


我知道这有点晚了,但是对于BinaryWriter和其他写入类,使用带有编码参数的构造函数。然后使用Encoding.BigEndianUnicode来以大端序写入数据。 - kam
1
@kam,你测试过这个吗?Encoding.BigEndianUnicode只是在调用WriteString()时的一个测试编码。我非常怀疑它会影响其他方法的字节序,特别是因为MSDN没有提到它。 - Jamie

11
作为附注,它会按照MSDN中指定的方式精确地将数据写入文件:

备注

BinaryWriter使用小端格式存储此数据类型。

你要求的是“大端格式”。你需要重新实现BinaryWriter才能实现。
请注意,BinaryWriterBitConverter有不同的行为。 BinaryWriter始终使用“小端”,而BitConverter.GetBytes(ushort)(这是一个完全不同的函数,但具有“共同”的连接:将数字转换为字节)是“本地端”(因此它使用计算机的字节顺序)。

注意

由GetBytes方法返回的数组中字节的顺序取决于计算机体系结构是小端还是大端。

最终,在Intel / AMD PC上,这种差异不重要:因为Intel是Little Endian,几乎所有手机也是如此。我所知道唯一支持.NET(在特殊版本中)的大例外是Xbox360。

4

如果我没记错的话,在显示中,输出的字节序与您的期望相反。虽然十六进制表示法 10240400,但它可能会存储为 0004,这取决于编码或平台的字节序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接