c# - Stream.read 给出损坏的字节

标签 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的情况下解决这个问题?

最佳答案

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

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

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

关于c# - Stream.read 给出损坏的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17220232/

相关文章:

python - 单元测试 Python Flask Stream

c# - 如何编写工具,在 Windows 中反转颜色?

c# - 向新注册用户发送验证电子邮件以激活他们的帐户

c# - 漂亮的、对设计师友好的 GUI 库

c# - 为什么我需要两次调用来流式传输 CopyTo?

C++ 流二次插入运算符

java - 程序在 Java 中初始化对象输入流时暂停

c# - 使用 AssemblyInstaller 安装 Windows 服务时出现问题

c# - 使用 "PreviousPage"从源页面获取值

android - 由 Media Player 播放的实时 mp3 流无需缓冲