BinaryReader根据BufferSize读取不同长度的数据

时间:2013-02-05 12:45:52

标签: c# httpwebrequest binaryreader

问题如下,我使用HttpWebRequestdmo.gov.uk请求一些在线数据。我正在使用BinaryReader阅读并写入MemoryStream的回复。我已经将使用的代码打包成一个简单的测试方法:

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

第二个数字,使用高缓冲区大小是我期望的确切文件大小(此文件每天更改,因此预计在今天的日期之后该大小会有所不同)。对于预期文件大小之后的所有内容,第一个数字包含\0

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

您应该将ms.GetBuffer();更改为ms.ToArray();

GetBuffer将返回整个MemoryStream缓冲区,而ToArray将返回MemoryStream内的所有值。