1

特定の操作に困惑していBinaryReaderます。

16 進エディタ (UltraEdit) でバイナリ ファイルを表示すると、最初の 4 バイトは次のようになり52 62 38 11ます。

を使用して同じファイルを反復処理するBinaryReader場合、最初に呼び出した場合ReadInt32()、int 値は 1,382,168,593 であると予想されます。

.ReadInt32(): 現在のストリームから 4 バイトの符号付き整数を読み取り、ストリームの現在位置を 4 バイト進めます。

代わりに、288,907,858 を取得します。

明らかに、明らかな何かが欠けています...何が起こっているのか誰か説明できますか?

4

2 に答える 2

12

BinaryReaderリトルエンディアン順でバイトを読み取ります。

観察:

csharp> 0x52623811;  // What you expected it to read.
1382168593
csharp> 0x11386252;  // What it actually read.
288907858

読み取っているデータのバイト順を指定する必要がある場合は、Mono.DataConvertを使用することをお勧めします。私はいくつかのプロジェクトでそれを使用しましたが、信じられないほど便利で、MIT ライセンスも取得しています。(パフォーマンス上の理由から安全でないコードを使用するため、信頼できないコンテキストでは使用できません。)

概念の詳細については、エンディアンに関するウィキペディアの記事を参照してください。

BinaryReader の実装の詳細については、Microsoft の参照ソースを参照してください。

于 2011-08-24T21:03:36.323 に答える
3

Intel アーキテクチャはリトルエンディアンです。シーケンスの最後のバイトが最高値になります。したがって、52 62 38 11 は 0x11386252 に相当します。

于 2011-08-24T21:05:07.087 に答える