6

ええと、「エンディアンネス」のテーマはいつも私には少し混乱していましたが、私が使用したバイナリライター/リーダーのデフォルトの動作について考える必要があるような問題に直面したことはありません。私は今c#でPNGデコーダーを書いています。PNGファイル形式の仕様では、すべての数値はビッグエンディアン表記で格納されると規定されています(これは非常に自然なことです)。ただし、.NETのBinaryReader/Writerがリトルエンディアン表記で動作することに気付いたときは非常に驚きました。私をさらに混乱させたのは、JavaのバイナリIOがビッグエンディアン表記で機能するという事実でした(Javaプログラマーではないので、おそらく私は間違っています)。それで私は次の質問について考え始めました:

1-なぜ現状のままなのか?基本クラスライブラリのデフォルトの動作を意味します。2-.NETのSystem.IOを使用するときに、優先表記を選択する方法がないのはなぜですか?

私は現在JonSkeet MiscUtilを使用しており、それは魅力のように機能します(thanks、man =))。しかし、この機能を基本クラスライブラリで見るのは素晴らしいことです。

4

3 に答える 3

10

これは、コードが最も重要なプラットフォームで可能な限り実行されるようになっているためです。C#/。NETはMicrosoft製で、主にx86プラットフォームで実行されます。x86はリトルエンディアンであるため、ライブラリをリトルエンディアンにすることは理にかなっています。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<Image> codec = Codecs.create(Image.class);

これを.NETに移植することについても話している人がいることは知っています。

于 2010-03-01T07:18:27.467 に答える