stream.read提供损坏的字节

时间:2013-06-20 17:40:08

标签: c# stream

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();

int sizeToRead = (int)response.ContentLength;
int sizeRead = 0;
int buffer = 1;
byte[] bytes = new byte[sizeToRead];
while (sizeToRead > 0)
{
    int rs = sizeToRead > buffer ? buffer : sizeToRead;
    stream.Read(bytes, sizeRead, rs);
    sizeToRead -= rs;
    sizeRead += rs;
}

stream.Close();
System.IO.File.WriteAllBytes("c:\\tmp\\b.mp3", bytes);

我有上面的代码。其目的是从某处下载mp3文件并将其保存到c:\ tmp \ filename。而且效果很好。

但是,如果我将缓冲区大小更改为不是1,例如512.下载的mp3文件将是沙哑的。我已将我的程序下载的文件与通过浏览器下载的文件进行比较,我发现我的程序下载的mp3文件的某些字节设置为0(它们的文件大小相同)。

此外,当我使用上面的代码下载mp3文件时,我还使用fiddler来监控流量。我从我的程序和浏览器中下载了mp3,所有字节都相同。

所以,我猜问题是在流阅读器或阅读过程中。有谁知道为什么会这样?以及如何在不将缓冲区大小设置为1的情况下解决它?

2 个答案:

答案 0 :(得分:5)

Stream.Read会返回int,告诉您实际读取的字节数。如果您正在处理流,您最好接收该信息并采取相应措施。

换句话说,只是因为你要求读取2个字节,并不意味着你的缓冲区包含2个有效字节。

如果你需要检索特定数量的字节(你知道的话),那么你应该循环,直到你获得了这个字节数。

答案 1 :(得分:1)

stream.Read()返回与rs相同的值吗?试试这个:

byte[] bytes = new byte[sizeToRead];
while (sizeToRead > 0) {
    int rs = sizeToRead > buffer ? buffer : sizeToRead;
    rs = stream.Read(bytes, sizeRead, rs);
    sizeToRead -= rs;
    sizeRead += rs;
}