6

好吧,“Endianness”主题总是让我有点困惑,但我从来没有遇到过任何需要我考虑我使用的二进制写入器/读取器的默认行为的问题。我现在正在用 c# 编写一个 PNG 解码器。PNG文件格式规范规定所有数字都以大端符号存储(我觉得这很自然)。然而,当我注意到 .NET 的 BinaryReader/Writer 使用小端符号时,我感到非常惊讶。更让我困惑的是,java 的二进制 IO 使用大端符号(我不是 java 程序员,所以也许我错了)。于是我开始思考以下问题:

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

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

4

3 回答 3

10

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

于 2010-02-28T20:41:56.627 回答
2

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

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

于 2010-02-28T20:48:38.827 回答
1

我想归结为始终能够同时处理这两种情况,无论您在哪个平台上。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<Image> codec = Codecs.create(Image.class);

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

于 2010-03-01T07:18:27.467 回答