【问题标题】:C# BinaryWriter - and endiannessC# BinaryWriter - 和字节序
【发布时间】:2016-03-10 07:11:29
【问题描述】:

我在我的代码中使用 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 吗?为什么?

【问题讨论】:

    标签: c# endianness binarywriter


    【解决方案1】:

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

    BinaryWriter 的情况下,它是小端。这意味着 LSB 先行 - 然后是 MSB。 因此,它被存储为:

    LSB | MSB
    00    04
    

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

    【讨论】:

    • 我知道这有点晚了,但是对于 BinaryWriter 和任何其他编写器类也使用采用编码的构造函数。然后使用 Encoding.BigEndianUnicode 改用大端写入。跨度>
    • @kam 你测试过这个吗? Encoding.BigEndianUnicode 只是您调用 WriteString() 时的测试编码。我非常怀疑它会影响其他方法的字节序,特别是因为 MSDN 没有提到它。
    【解决方案2】:

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

    备注

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

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

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

    注意

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-13
        • 2023-03-28
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多