1

これらの一連のメソッドの何が問題になっている可能性がありますか?

        byte[] bytes;

        using (var memory_stream = new MemoryStream())
        using (var gzip_stream = new GZipStream(memory_stream, CompressionMode.Compress))
        {
            var buffer = Encoding.Default.GetBytes("Hello nurse!");
            gzip_stream.Write(buffer, 0, buffer.Length);
            bytes = memory_stream.ToArray();
        }

        int total_read = 0;

        using (var input_stream = new MemoryStream(bytes))
        using (var gzip_stream = new GZipStream(input_stream, CompressionMode.Decompress, true))
        {
            int read;
            var buffer = new byte[4096];
            while ((read = gzip_stream.Read(buffer, 0, buffer.Length)) != 0) {
                total_read += read;
            }
        }

        Debug.WriteLine(bytes);
        Debug.WriteLine(total_read);

gzipStrは有効なGzip圧縮ストリームです(GzipStream()Compressを使用して正常に圧縮できます)。

total_readが常に0であるのはなぜですか?gzipストリームは私のストリームを解凍していますか?私は何か間違ったことをしていますか?

私はここで何が間違っているのですか???!!!

4

1 に答える 1

2

フラッシュするのを忘れました。:) Encoding.Default は通常、本番環境では使用しないでください。以下では、これを Encoding.UTF8 (または適切なもの) に置き換えます。最後に、もちろん、以下の santiy-check は、すべてが単一のバッファーに収まる場合にのみ機能します。しかし今、あなたはアイデアを得る必要があります。

kementeus は、ここの以前のコードが役に立たなかったと指摘したので、以下は私が使用した正確なコードです。

public class GzipBug
{
    public static void Main(String[] a)
    {
        byte[] bytes;
    byte[] buffer;

    Encoding encoding = Encoding.UTF8;

        using (var memory_stream = new MemoryStream())
        using (var gzip_stream = new GZipStream(memory_stream, CompressionMode.Compress))
        {
            buffer = encoding.GetBytes("Hello nurse!");
            gzip_stream.Write(buffer, 0, buffer.Length);
        gzip_stream.Flush();
        bytes = memory_stream.ToArray();
        }

        int total_read = 0;

        using (var input_stream = new MemoryStream(bytes))
        using (var gzip_stream = new GZipStream(input_stream, CompressionMode.Decompress, true))
        {
        int read;
            buffer = new byte[4096];
            while ((read = gzip_stream.Read(buffer, 0, buffer.Length)) != 0) {
        total_read += read;
            }
        }

        Debug.WriteLine(encoding.GetString(buffer, 0, total_read));
        Debug.WriteLine(total_read);

    }
}

gmcs -d:DEBUG -langversion:linq -debug+ GzipBug.cs でコンパイルされ、次のように実行されます: MONO_TRACE_LISTENER=Console.Out GzipBug.exe

(MONO_TRACE_LISTENER ビットを削除できます)

于 2009-04-26T04:54:08.433 に答える