2011-01-20 8 views
1

これでBinaryWriterを使用してファイルをバイナリ形式に変換しました。形式は次のとおりです。バイナリ形式のファイルから32ビット整数の配列を読み込みますか?

int of ints、ints。

ように、コードのようなものになります。

readLineOfNumbers() { 
    count = read(); 
    int[] a = read(count ints); 
    return a; 
} 

私はBinaryReaderを使用していますか?私がそこで見ることができる最も近いことは、すべてをバイト[]に読み込むことですが、次にそれをどのようにしてint配列にしますか?これはすべて非常に効率的に行う必要があります。私はバッファリングなどが必要です。

答えて

1

BinaryReaderの中に整数の配列を読み取るものはありません。恐れがあります。バイト配列を読み込むとBuffer.BlockCopyを使用して、これらのバイトをint[]にコピーすることができます。これはおそらく最も速い形式の変換ですが、データの適切なプロセッサのエンディアンに依存します。

を試してみましたが、必要な回数だけBinaryReader.ReadInt32()を呼び出し、ファイルシステムにバッファリングをさせますか?あなたが助けてくれると思えば、大きなバッファを持つBufferedStreamをいつもミックスに追加することができます。

1
int[] original = { 1, 2, 3, 4 }, copy; 
byte[] bytes; 
using (var ms = new MemoryStream()) 
{ 
    using (var writer = new BinaryWriter(ms)) 
    { 
     writer.Write(original.Length); 
     for (int i = 0; i < original.Length; i++) 
      writer.Write(original[i]); 
    } 
    bytes = ms.ToArray(); 
} 
using (var ms = new MemoryStream(bytes)) 
using (var reader = new BinaryReader(ms)) 
{ 
    int len = reader.ReadInt32(); 
    copy = new int[len]; 
    for (int i = 0; i < len; i++) 
    { 
     copy[i] = reader.ReadInt32(); 
    } 
} 

私はちょうどストリームw/o BinaryReaderから読んでいましたが個人的には。

実際には、厳密にが、それは私だった場合、私は私のown serializerを使用して、ちょうどなり、話す:これはバッファリングを扱う、エンディアンを知っているだろう、と助けるために可変長符号化を使用しますので、

[ProtoContract] 
public class Foo { 
    [ProtoMember(1, Options = MemberSerializationOptions.Packed)] 
    public int[] Bar {get;set;} 
} 

を数字の大部分が巨額でない場合には、膨らみを減らします。

+0

;代わりに20のいるProtobufを経由して6バイト - コースのを私が使用している数字はすべて小さいです) –

2

ファイルを作成するためにBinaryWriterを使用している場合、それはBinaryReader

に何かのように使用してそれを読むことは理にかなって:(ちょうどサンプルデータでテスト

private static int[] ReadArray(BinaryReader reader) 
    { 
     int count = reader.ReadInt32(); 
     int[] data = new int[count]; 
     for (int i = 0; i < count; i++) 
     { 
      data[i] = reader.ReadInt32(); 
     } 
     return data; 
    } 
関連する問題