代码之家  ›  专栏  ›  技术社区  ›  Captain Sensible

gzipstream还是deflatestream类?

  •  51
  • Captain Sensible  · 技术社区  · 16 年前

    MSDN文档告诉我以下内容:

    gzipstream类使用gzip 数据格式,包括循环 检测冗余校验值 数据损坏。gzip数据格式 使用与相同的压缩算法 deflatestream类。

    似乎gzipstream向输出添加了一些额外的数据(相对于deflatestream)。我想知道,在什么类型的场景中,使用gzipstream而不是deflatestream是必要的?

    5 回复  |  直到 10 年前
        1
  •  69
  •   Aaronaught    16 年前

    deflate只是压缩算法。gzip实际上是一种格式。

    如果您使用 GZipStream 压缩文件(并用扩展名保存文件 .gz ,结果实际上可以由winzip或 gzip 工具。如果你用 DeflateStream ,这些工具无法识别该文件。

    如果压缩文件设计为通过这些工具打开,则必须使用 GZIPFISH 而不是 排水井 .

    如果您在不可靠的介质(即Internet连接)上传输大量数据,而不使用TCP/IP等纠错协议,我也会认为这一点很重要。例如,您可能正在通过串行端口、原始套接字或UDP进行传输。在这种情况下,您肯定希望gzip格式中嵌入CRC信息,以确保数据正确。

        2
  •  11
  •   agnain    14 年前

    gzipstream与deflatestream相同,但它添加了一些crc以确保数据没有错误。

        3
  •  5
  •   abatishchev Karl Johan    15 年前

    嗯,我的第一个回答完全错了。我在Mono源代码中查找到,gzipstream类实际上将其读/写(以及几乎所有其他)调用重定向到内部deflatestream对象的适当方法调用:

    public override int Read (byte[] dest, int dest_offset, int count)
    {
        return deflateStream.Read(dest, dest_offset, count);
    }
    
    public override void Write (byte[] src, int src_offset, int count)
    {
        deflateStream.Write (src, src_offset, count);
    }
    

    唯一的区别是,它总是创建一个gzip标志设置为true的deflatestream对象。 这当然不是你问题的答案,但也许会有所帮助。

        4
  •  2
  •   Stefan Steiger Marco van de Voort    12 年前

    同上,根据Aaronought

    注意另一个重要区别
    http://www.webpronews.com/gzip-vs-deflate-compression-and-performance-2006-12 :

    我测量的数据流比gzip快41%。

    我没有测量速度,但我测量了文件大小以使其接近。相同的。

        5
  •  1
  •   Arsen Zahray    10 年前

    虽然gzipstream似乎正在使用deflatestream进行解压,但这两种算法似乎不可互换。以下测试代码将为您提供一个异常:

            MemoryStream wtt=new MemoryStream();
            using (var gs=new GZipStream(wtt,CompressionMode.Compress,true))
            {
                using (var sw=new StreamWriter(gs,Encoding.ASCII,1024,true))
                {
                    sw.WriteLine("Hello");
                }
            }
            wtt.Position = 0;
            using (var ds = new DeflateStream(wtt, CompressionMode.Decompress, true))
            {
                using (var sr=new StreamReader(ds,Encoding.ASCII,true,1024,true))
                {
                    var txt = sr.ReadLine();
                }
            }
    
    推荐文章