0

問題は次のとおりです。私はdmo.gov.ukHttpWebRequestからいくつかのオンラインデータを要求 するためにを使用しています。を使用して読み取り、に書き込みを行っている応答。使用しているコードを簡単なテストメソッドにパッケージ化しました。BinaryReaderMemoryStream

public static byte[] Test(int bufferSize)
{
    var request = (HttpWebRequest)WebRequest.Create("http://www.dmo.gov.uk/xmlData.aspx?rptCode=D3B.2");
    request.Method = "GET";
    request.Credentials = CredentialCache.DefaultCredentials;

    var buffer = new byte[bufferSize];
    using (var httpResponse = (HttpWebResponse)request.GetResponse())
    {
        using (var ms = new MemoryStream())
        {
            using (var reader = new BinaryReader(httpResponse.GetResponseStream()))
            {
                int bytesRead;
                while ((bytesRead = reader.Read(buffer, 0, bufferSize)) > 0)
                {
                    ms.Write(buffer, 0, bytesRead);
                }
            }
            return ms.GetBuffer();
        }
    }
}

私の実際のコードは通常2048バイトのバッファサイズを使用しますが、今日、このファイル\0の最後に大量の空のバイト()があり、ファイルサイズが大きくなっていることに気付きました。テストとして、バッファサイズを予想したファイルサイズに近い値に増やしてみました(約80Kbを予想していたので、バッファサイズを79000にしました)。これで、適切なファイルサイズが得られました。しかし、私は混乱しています。データの読み取りに使用されるバッファーサイズに関係なく、同じファイルサイズを取得することを期待していました。

次のテスト:

Console.WriteLine(Test(2048).Length);
Console.WriteLine(Test(79000).Length);
Console.ReadLine();

次の出力が得られます。

131072
81341

高いバッファサイズを使用した2番目の図は、私が期待していた正確なファイルサイズです(このファイルは毎日変更されるため、今日の日付以降はサイズが異なると予想されます)。最初の図には\0、予想されるファイルサイズ以降のすべてが含まれています。

何が起きてる?

4

1 に答える 1

1

ms.GetBuffer();に変更する必要がありますms.ToArray();

GetBufferMemoryStreamはバッファ全体ToArrayを返しますが、 は 内のすべての値を返しますMemoryStream

于 2013-02-05T12:52:10.420 に答える