2012-05-03 20 views
0

私はどうなるのバイト数を読んでいた場合は、次の読書のUInt16番号のみバイナリファイル

using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) 
{ 
    int size = (int) stream.Length; 
    BinaryReader br = new BinaryReader(stream); 
    byte[] test = new byte[size]; 
    test = br.ReadBytes(size); 
    br.Close(); 
} 

しかし、私はuint16のを読みたい以来、私はやって打たいます:

using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) 
{ 
    int size = (int) stream.Length; 
    BinaryReader br = new BinaryReader(stream); 
    float[] test = new byte[size/2]; 
    for (int i = 0; i < size/2; ++i) 
    { 
     test[i] = br.ReadUInt16(); 
    } 
    br.Close(); 
} 

は速くあり一度にファイル全体を読み取る方法または速度の違いは無視できるのでしょうか?

答えて

0

ファイルが大きすぎてメモリに収まらない場合は、すべてのバイトをMemoryStreamに読み込み、そのストリームからUint16sを読み取る方が高速になります。次の行

test = br.ReadBytes(size); 

配列へtestポイントを作るため

byte[] test = new byte[size]; 

:そうのように:

byte[] data; 
int size; 
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) 
{ 
    size = (int) stream.Length; 
    data = new byte[size]; 
    stream.Read(data, 0, size); 
} 

uint[] uintData = new uint[size/2]; 
using (var memoryStream = new MemoryStream(data)) 
using (var reader = new BinaryReader(memoryStream)) 
    for (int i = 0; i < size/2; i++) 
     uintData[i] = reader.ReadUInt16(); 

// Done. 
+1

詳細を教えてください:) – Smash

0

まず、あなたは、この行は必要ありません。したがって、

byte[] test = br.ReadBytes(size); 

で十分です。あなたの質問について


BinaryReader.ReadBytesはちょうど(あなたがILSpyまたはリファレンスソースコードを見て、これを確認することができます)ループでStream.Read Sを実行するので、私はあなたのコード例間の性能差があることを前提としていたいです無視できる。確かに、私はあなたが測定を行うことをお勧めしたいと思います。

+0

測定部分については、私はそれがより簡単になると思っていました。 – Smash

関連する問題