2
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 ファイルをダウンロードするときに、フィドラーを使用してトラフィックを監視しました。プログラムとブラウザからダウンロードした mp3 を比較しましたが、すべてのバイトが同じです。

したがって、問題はストリームリーダーまたは読み取りプロセス内にあると思います。なぜそれが起こるのか誰か知っていますか?バッファサイズを1に設定せずに解決する方法は?

4

2 に答える 2

5

Stream.Read実際に読み取らintれたバイト数を示す を返します。ストリームを扱っている場合は、実際にその情報を取り入れて、それに基づいて行動する方がよいでしょう。

別の言い方をすれば、2 バイトの読み取りを要求したからといって、バッファーに有効な 2 バイトが含まれているとは限りません。

特定のバイト数 (知っている) を取得する必要がある場合は、そのバイト数を取得するまでループする必要があります。

于 2013-06-20T17:43:43.383 に答える
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;
}
于 2013-06-20T17:44:55.643 に答える