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上で簡単に行くためにバイト配列を再利用したいと思います。
これが起こる理由はありますか?設定が間違っているのですか?
それはネットワークストリームであるという事実に関係するかもしれませんか?新しいバイト配列を作成すると、ストリームの一部がフリーズしますが、後でそのフリーズされたストリームを解析して残りのストリームを解析すると、一致しません。注意:私のズボンで完全に飛んでいるネットワークストリームでは決して働かないでください:) –
'ReadBytes'の条件が満たされてから、要求されたバイト数が少なくなっていますか?どのような条件の下では、 'Read'はより少ないバイトを読み込んで要求できますか?この条件はどう違うのですか? – PetSerAl