.net gzip解压缩流的问题

时间:2009-04-26 03:46:44

标签: .net compression gzip

这些方法有什么问题?

        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()压缩成功压缩它。)

为什么total_read总是0 ???是gzip流解压缩我的流吗?我做错了什么?

我在这里做错了什么??? !!!

1 个答案:

答案 0 :(得分: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位)