4

を使用してファイルを読み取ろうとしていますBinaryReader。しかし、期待される値を取得するのに問題があります。

using (BinaryReader b = new BinaryReader(File.Open("file.dat", FileMode.Open)))
{
    int result = b.ReadInt32(); //expected to be 2051
}

"file.dat"次は...

00 00 08 03 00 00 EA 60

期待される結果はであるはずですが2051、代わりにまったく無関係なものが得られます。毎回得られる結果は同じであることに注意してください。

何が問題ですか?

4

4 に答える 4

7

BinaryReader.ReadInt32は、データがリトルエンディアン形式であることを想定しています。提示したデータはビッグエンディアンです。

BinaryWriterがInt32をメモリに書き込む方法の出力を示すサンプルプログラムを次に示します。

namespace Endian {
  using System;
  using System.IO;

  static class Program {
    static void Main() {
      int a = 2051;

      using (MemoryStream stream = new MemoryStream()) {
        using (BinaryWriter writer = new BinaryWriter(stream)) {
          writer.Write(a);
        }

        foreach (byte b in stream.ToArray()) {
          Console.Write("{0:X2} ", b);
        }
      }

      Console.WriteLine();
    }
  }
}

これを実行すると、次の出力が生成されます。

03 08 00 00

2つの間で変換するには、を使用して4バイトを読み取り、配列を逆にBinaryReader.ReadBytes(4)してから、を使用して使用可能なintに変換します。BitConverter.ToInt32

byte[] data = reader.ReadBytes(4);
Array.Reverse(data);
int result = BitConverter.ToInt32(data);
于 2012-11-19T15:25:11.687 に答える
5

00 00 08 03 2051ですが、バイトが実際にリストした順序でファイルにある場合、それらは間違った順序になっています。4バイト整数0x0803は、03 08 00 00最下位バイトを最初に、または「リトルエンディアン」として格納する必要があります。

オフハンド私はあなたが答えとして50855936を得ていると思いますか?これは00 00 08 03、最上位バイトの「ビッグエンディアン」の順序です。

x86アーキテクチャはリトルエンディアンです。他のほとんどのアーキテクチャはビッグエンディアンです。データファイルがビッグエンディアンマシンに保存されているか、「インターネット」の標準バイトオーダーであるため、明示的にビッグエンディアンに保存されている可能性があります。

ビッグエンディアンからリトルエンディアンに変換するには、4バイトの順序を切り替える必要があります。これを行う最も簡単な方法は、IPAddress.NetworkToHostOrderメソッドです(「ネットワーク」の順序はビッグエンディアン、x86の「ホスト」の順序はリトルエンディアンです)。

于 2012-11-19T15:25:10.453 に答える
3

MSDN によると、BinaryReader.ReadInt32リトルエンディアンです。これを試して:

using (BinaryReader b = new BinaryReader(File.Open("file.dat", FileMode.Open)))
{
    int result = IPAddress.NetworkToHostOrder(b.ReadInt32()); //expected to be 2051
}
于 2012-11-19T15:25:39.553 に答える
2

BitConverter.IsLittleEndianコードを実行しているマシンのエンディアンを確認するために使用できます。ロードしているファイルと同じエンディアンでない場合は、に変換する前にバイトを逆にする必要がありますint

于 2012-11-19T15:39:42.877 に答える