2017-06-26 7 views
0

BinaryReaderを配列に読み込むことができます。リーダーの基になるStreamはBufferedStream(基底のストリームはネットワークストリームです)です。 reader.Read(arr, 0, len)メソッドがreader.ReadBytes(len)以外の異なる(間違った)結果を返すことがあることに気付きました。C#BinaryReader ReadBytes(len)は、Read(bytes、0、len)とは異なる結果を返します。

基本的に私のセットアップコードは次のようになります。

var httpClient = new HttpClient(); 
var reader = new BinaryReader(new BufferedStream(await httpClient.GetStreamAsync(url).ConfigureAwait(false))); 

後でラインの下、私は読者からのバイト配列を読んでいます。 sz変数が両方のシナリオで同じであることを確認できます。

int sz = ReadSize(reader); //sz of the array to read 
if (bytes == null || bytes.Length <= sz) 
{ 
    bytes = new byte[sz]; 
} 

//reader.Read will return different results than reader.ReadBytes sometimes 
//everything else is the same up until this point 
//var tempBytes = reader.ReadBytes(sz); <- this will return right results 
reader.Read(bytes, 0, sz); // <- this will not return the right results sometimes 

reader.Readメソッドは、ストリームの中にさらに読んでいるようですが、この問題が発生した後に、構文解析の残りの部分が解除されますので、それは、にか何か必要以上と思われます。明らかに私はreader.ReadBytesに固執することができましたが、私はここでGC上で簡単に行くためにバイト配列を再利用したいと思います。

これが起こる理由はありますか?設定が間違っているのですか?

+0

それはネットワークストリームであるという事実に関係するかもしれませんか?新しいバイト配列を作成すると、ストリームの一部がフリーズしますが、後でそのフリーズされたストリームを解析して残りのストリームを解析すると、一致しません。注意:私のズボンで完全に飛んでいるネットワークストリームでは決して働かないでください:) –

+0

'ReadBytes'の条件が満たされてから、要求されたバイト数が少なくなっていますか?どのような条件の下では、 'Read'はより少ないバイトを読み込んで要求できますか?この条件はどう違うのですか? – PetSerAl

答えて

0

Read(bytes, 0, len)は指定されたバイト配列をクリアしないため、この関数を呼び出す前にbytes配列をクリアすることをお勧めします。私はずっと前に私のパーサーの一人でこの問題を抱えていました。すべての要素をゼロに設定するか、指定された値だけを読み取る(解析する)ことを確認してください。len

関連する問題