首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# BinaryWriter -和endianness

C# BinaryWriter -和endianness
EN

Stack Overflow用户
提问于 2016-03-10 07:11:29
回答 3查看 9.4K关注 0票数 14

我在代码中使用BinaryWriter,下面是我的代码:

代码语言:javascript
复制
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吗?为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-10 07:14:38

虽然1024是0x0400。当涉及到将其存储在文件或内存中时,问题是我们应该使用小endian还是大endian符号?

如果是BinaryWriter,则是小endian。这意味着LSB先来,然后是MSB。因此,它存储为:

代码语言:javascript
复制
LSB | MSB
00    04

你可以读到更多关于endianness的内容。

票数 13
EN

Stack Overflow用户

发布于 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。

票数 11
EN

Stack Overflow用户

发布于 2016-03-10 07:15:22

如果我没有弄错的话,在显示中,输出的结束性与您的期望相反。尽管1024的十六进制表示形式是0400,但它可以存储为0004,这取决于编码或平台的端点性。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35909877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档