编程语言中的字节序

好吧,“Endianness”主题对我来说总是有点混乱,但我从来没有遇到过任何问题,这些问题要求我甚至考虑我使用的二进制编写器/阅读器的默认行为。 我正在c#中写一个PNG解码器。 PNG文件格式规范声明所有数字都以大端符号存储(我觉得非常自然)。 但是,当我注意到.NET的BinaryReader / Writer使用一个小尾数表示法时,我感到非常惊讶。 让我更加困惑的是,事实上,java的二进制IO与大端符号一起工作(不是java程序员,所以也许我错了)。 所以我开始考虑以下问题:

1 – 为什么它们是这样的? 我的意思是基类库的默认行为。 2 – 为什么在使用.NET的System.IO时无法选择首选符号?

我目前正在使用Jon Skeet的 MiscUtil ,它就像一个魅力(感谢,man =))。 但是在基类库中看到这个function会很酷。

这是因为代码意味着在最重要的平台上尽可能地运行。 C#/ .NET来自Microsoft,主要在x86平台上运行。 x86是little-endian,因此将库设为little-endian是有意义的。 Java由Sun制作,Sun SPARC是big-endian,因此Java标准是big-endian。

BCL包含System.BitConverter静态类中的东西,允许您处理系统字节序。 因此,BitConverter中的所有方法基本上都是平台无关的。

此外, System.Net.IPAddress.NetworkToHostOrder方法允许您将字节序从大端更改为小端,反之亦然。

我想这可以归结为总是能够处理两者 ,无论你在哪个平台。 Preon试图隐藏一些复杂性,允许您以声明方式(使用注释)定义内存中数据表示与编码表示之间的映射。

因此,如果这是您的数据结构的一部分:

 public Image { int width; int height; } 

然后定义到自然大端表示的映射就像这样简单:

 public Image { @BoundNumber int width; @BoundNumber int height; } 

但是,如果表示是小端,那么你可以这样做:

 public Image { @BoundNumber(byteOrder=LittleEndian) int width; @BoundNumber(byteOrder=LittleEndian) int height; } 

在这两种情况下,为此数据结构创建编解码器都是相同的:

 Codec codec = Codecs.create(Image.class); 

我知道有些人在讨论将此移植到.NET。