代码之家  ›  专栏  ›  技术社区  ›  kementeus

.net gzip解压缩流的问题

  •  1
  • kementeus  · 技术社区  · 17 年前

    这些方法有什么问题?

            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);
    

    为什么总读数总是0???gzip流正在解压缩我的流吗?我做错什么了吗?

    1 回复  |  直到 17 年前
        1
  •  2
  •   Matthew Flaschen    17 年前

    你忘了冲水。:)注意编码。默认值一般不应用于生产。在下面,将其替换为编码.UTF8(或任何合适的)。最后,当然,下面的santiy检查只有在所有东西都放在一个缓冲区中时才起作用。但现在你应该明白了。

    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:调试-langversion:linq-debug+GzipBug.cs文件 单声道侦听器=控制台。出去GzipBug.exe文件

    推荐文章