[英]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.