关于c#:编程语言中的字节序

Endianness in programming languages

好吧,"字节序"主题总是让我有些困惑,但是我从来没有遇到过任何问题,这些问题甚至需要我考虑一下我使用的二进制编写器/读取器的默认行为。我现在正在用C#编写PNG解码器。 PNG文件格式规范指出,所有数字都以大尾数法表示(我觉得很自然)。但是,当我注意到.NET的BinaryReader / Writer使用一点尾数表示法时,我感到非常惊讶。更让我感到困惑的是,事实是Java的二进制IO使用大端符号(不是Java程序员,所以我可能是错的)。所以我开始考虑以下问题:

1-为什么情况如此?我的意思是基类库的默认行为。
2-为什么在使用.NET的System.IO时无法选择首选符号?

我目前正在使用Jon Skeet的MiscUtil,它的工作原理就像一个吊饰(感谢man =)。但是在基类库中看到此功能将很酷。


这是因为该代码应尽可能在最重要的平台上运行。 C#/。NET来自Microsoft,主要在x86平台上运行。 x86是低位优先的,因此使库成为低位优先是有意义的。 Java是由Sun制造的,而Sun SPARC是big-endian的,因此Java标准是big-endian的。


BCL包含System.BitConverter静态类中的内容,使您可以处理系统字节序。结果,BitConverter中的所有方法本质上都是平台无关的。

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


我认为归结为始终能够同时处理这两者,无论您使用的平台是什么。 Preon试图通过允许您声明性地(使用批注)定义内存中数据表示形式与编码表示形式之间的映射,来掩饰某些复杂性。

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

1
2
3
4
public Image {
    int width;
    int height;
}

然后定义到自然的大端序表示的映射将很容易:

1
2
3
4
public Image {
    @BoundNumber int width;
    @BoundNumber int height;
}

但是,如果表示形式为小端,则可以执行以下操作:

1
2
3
4
public Image {
    @BoundNumber(byteOrder=LittleEndian) int width;
    @BoundNumber(byteOrder=LittleEndian) int height;
}

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

1
Codec<Image> codec = Codecs.create(Image.class);

我知道有些人也在谈论将其移植到.NET。