2013-02-05 37 views
0

問題如下,我正在使用HttpWebRequest來請求dmo.gov.uk的一些在線數據。我正在閱讀的回覆使用BinaryReader並寫入MemoryStream。我已經打包所使用到一個簡單的測試方法的代碼:BinaryReader根據BufferSize讀取不同長度的數據

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(); 

產率follwoing輸出:

131072 
81341 

第二圖中,使用高緩衝區大小的實際文件大小我每日期待(此文件的變化,所以預計在今天的日期之後這個大小會有所不同)。第一個數字包含\0之後的所有文件大小。

這是怎麼回事?

回答

1

您應該將ms.GetBuffer();更改爲ms.ToArray();

GetBuffer將返回整個MemoryStream緩衝區,而ToArray將返回MemoryStream中的所有值。

+0

謝謝。我之前遇到過這個確切的問題,但在我的生活中卻無法想象發生了什麼。 – Jamiec