stream.read 给出损坏的字节

本文关键字:字节 损坏 read stream | 更新日期: 2023-09-27 18:19:27

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''文件名。而且它工作得很好。

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

此外,当我使用上述代码下载mp3文件时,我还使用提琴手来监控流量。我区分了从我的程序和浏览器下载的mp3,所有字节都是一样的。

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

stream.read 给出损坏的字节

Stream.Read返回一个int,告诉您实际读取了多少字节。如果您正在处理流,您最好实际获取该信息并采取行动。

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

如果您需要检索特定数量的字节(您知道(,则应循环,直到获得该字节数。

是流。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;
}