我在代码中使用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吗?为什么?
发布于 2016-03-10 07:14:38
虽然1024是0x0400。当涉及到将其存储在文件或内存中时,问题是我们应该使用小endian还是大endian符号?
如果是BinaryWriter,则是小endian。这意味着LSB先来,然后是MSB。因此,它存储为:
LSB | MSB
00 04你可以读到更多关于endianness的内容。
发布于 2016-03-10 07:40:32
作为sidenote,它按照中指定的写入文件msdn。
备注 BinaryWriter以小endian格式存储此数据类型。
你要的是“大字号格式”。您必须重新实现BinaryWriter才能做到这一点。
请注意,BinaryWriter的行为与BitConverter不同。BinaryWriter是“始终是小端点”,而BitConverter.GetBytes(ushort) (这是一个完全不同的函数,但它有一个“公共”连接:将数字转换为字节)是“本地- endian”(因此它使用了计算机的endianness )。
Note GetBytes方法返回的数组中的字节顺序取决于计算机体系结构是小端点还是大端字节。
在英特尔( Intel )和AMD(AMD)的个人电脑上,这种差异是没有意义的:英特尔是小终端,几乎所有的手机都是如此。我所知道的唯一支持.NET (在特殊版本中)的最大例外是Xbox360。
发布于 2016-03-10 07:15:22
如果我没有弄错的话,在显示中,输出的结束性与您的期望相反。尽管1024的十六进制表示形式是0400,但它可以存储为0004,这取决于编码或平台的端点性。
https://stackoverflow.com/questions/35909877
复制相似问题