繁体   English   中英

C#BinaryWriter - 和endianness

[英]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 当把它存储在文件或内存中时,我们应该使用little endian或big endian表示法来提问吗?

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

LSB | MSB
00    04

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

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

备注

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

你要求的是“大端格式”。 您必须重新实现BinaryWriter才能执行此操作。

请注意, BinaryWriter具有与BitConverter不同的行为。 BinaryWriter是“总是小端”,而BitConverter.GetBytes(ushort) (这是一个完全不同的函数但具有“通用”连接:将数字转换为字节)是“local-endian”(因此它使用了endianness电脑)

注意

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM