如何将zlib,gzip和zip相关联?它们有什么共同之处,它们有何不同?

Abh*_*ain 921 compression zip gzip zlib

zlib中使用的压缩算法与gzipzip中的压缩算法基本相同.什么是gzipzip?它们有何不同,它们是如何相同的?

Mar*_*ler 2404

简写:

.zip是一种归档格式,通常使用Deflate压缩方法.的.gzgzip格式为单个文件,也使用deflate压缩方法.通常的gzip结合使用以焦油进行压缩存档格式,.tar.gz.的zlib库提供了通过拉链,gzip的,使用DEFLATE压缩和解压缩代码PNG(它使用的zlib包装上放气的数据),和许多其它应用.

长表:

ZIP格式是由菲尔·卡茨开发与开放的规范,他的执行,PKZIP,是共享的开放格式.它是一种存档格式,用于存储文件及其目录结构,其中每个文件都是单独压缩的.文件类型是.zip.可以选择加密文件以及目录结构.

ZIP格式支持多种压缩方法:

0 - The file is stored (no compression)
1 - The file is Shrunk
2 - The file is Reduced with compression factor 1
3 - The file is Reduced with compression factor 2
4 - The file is Reduced with compression factor 3
5 - The file is Reduced with compression factor 4
6 - The file is Imploded
7 - Reserved for Tokenizing compression algorithm
8 - The file is Deflated
9 - Enhanced Deflating using Deflate64(tm)
10 - PKWARE Data Compression Library Imploding (old IBM TERSE)
11 - Reserved by PKWARE
12 - File is compressed using BZIP2 algorithm
13 - Reserved by PKWARE
14 - LZMA (EFS)
15 - Reserved by PKWARE
16 - Reserved by PKWARE
17 - Reserved by PKWARE
18 - File is compressed using IBM TERSE (new)
19 - IBM LZ77 z Architecture (PFS)
97 - WavPack compressed data
98 - PPMd version I, Rev 1
Run Code Online (Sandbox Code Playgroud)

方法1至7是历史的并且未使用.方法9至98是相对较新的添加物,并且具有不同的少量使用.在ZIP格式中真正广泛使用的唯一方法是方法8,Deflate,以及一些较小范围的方法0,它根本不压缩.实际上.zip,您将在野外遇到的每个文件都将使用方法8和0,可能只是方法8.(方法8还有一种方法可以有效地存储数据而不进行压缩和相对较少的扩展,并且方法0无法流式传输而方法8可以.)

文件容器ISO/IEC 21320-1:2015标准是受限制的zip格式,例如用于Java归档文件(.jar),Office Open XML文件(Microsoft Office .docx,.xlsx,.pptx),Office文档格式化文件(.odt,.ods,.odp)和EPUB文件(.epub).该标准将压缩方法限制为0和8,以及其他约束,如无加密或签名.

大约在1990年,Info-ZIP小组编写了便携式,免费,开源的实现zipunzip实用程序,支持使用Deflate格式进行压缩,以及对该格式和早期格式进行解压缩.这极大地扩展了.zip格式的使用.

在90年代早期,gzip格式被开发为Unix compress实用程序的替代品,源自Info-ZIP实用程序中的Deflate代码.Unix compress旨在压缩单个文件或流,并附.Z加到文件名. compress使用LZW压缩算法,该算法当时属于专利,其免费使用受到专利持有人的争议.虽然Deflate的某些特定实现是由Phil Katz申请专利的,但格式不是,所以有可能编写一个不侵犯任何专利的Deflate实现.在过去的20多年里,这种实施并未受到如此严峻的挑战.Unix gzip实用程序旨在作为替代compress,并且实际上能够解压缩压缩compress数据(假设您能够解析该句子). gzip将a附加.gz到文件名. gzip使用Deflate压缩数据格式,它比Unix压缩得更好compress,具有非常快速的解压缩,并添加CRC-32作为数据的完整性检查.标头格式还允许存储比compress允许的格式更多的信息,例如原始文件名和文件修改时间.

虽然compress只压缩单个文件,但通常使用该tar实用程序将文件,其属性和目录结构的存档创建到单个.tar文件中,然后使用compress.tar.Z文件压缩它来创建文件.实际上,tar实用程序已经并且仍然可以选择同时进行压缩,而不必将输出管道tar传递给compress.这一切都继续使用gzip格式,并且tar可以选择直接压缩.tar.gz格式.该tar.gz格式压缩比更好.zip的方法,因为的压缩.tar可以利用冗余的跨文件,尤其是许多小文件. .tar.gz由于其非常高的可移植性,它是Unix上最常用的归档格式,但是还有更有效的压缩方法,因此您经常会看到.tar.bz2.tar.xz归档.

与之不同的是.tar,最后.zip有一个中心目录,它提供了一个内容列表.这和单独的压缩提供了对.zip文件中各个条目的随机访问.一个.tar文件必须被解压缩,并从开始扫描,以建立一个目录,这是如何结束.tar的文件中列出.

在引入gzip之后不久,大约在20世纪90年代中期,同样的专利纠纷质疑.gif图像格式的自由使用,广泛用于公告板和万维网(当时的新事物).因此,一个小组创建了具有文件类型的PNG无损压缩图像格式.png来替换.gif.该格式还使用Deflate格式进行压缩,这是在图像数据上的过滤器暴露更多冗余之后应用的.为了促进PNG格式的广泛使用,创建了两个免费的代码库. libpngzlib.libpng处理了PNG格式的所有功能,zlib提供了压缩和解压缩代码供libpng以及其他应用程序使用.zlib改编自gzip代码.

所有提到的专利都已过期.

zlib库支持Deflate压缩和解压缩,以及围绕deflate流的三种包装.它们是:根本没有包装("原始"deflate),zlib包装(用于PNG格式数据块)和gzip包装,为程序员提供gzip例程.zlib和gzip包装的主要区别在于zlib包装更紧凑,6个字节,而gzip最少18个字节,完整性检查Adler-32运行速度比gzip使用的CRC-32快.原始deflate由读取和写入.zip格式的程序使用,这是另一种环绕压缩数据的格式.

zlib现在广泛用于数据传输和存储.例如,服务器和浏览器的大多数HTTP事务使用zlib压缩和解压缩数据.

deflate的不同实现可以导致相同输入数据的不同压缩输出,如可选择的压缩级别的存在所证明的,其允许折衷CPU时间的压缩有效性.zlib和PKZIP并不是deflate压缩和解压缩的唯一实现.无论是7-Zip的归档工具和谷歌的zopfli库必须使用deflate格式时,降低了压缩的大小由几个百分点,以挤掉可能最后几位用更多的CPU时间比zlib的能力相比zlib的最高压缩等级.的pigz效用,并行执行的gzip,包括对使用zlib(压缩级别1-9)或zopfli(压缩级11)的选项,并在某种程度上缓解使用zopfli通过在多个处理器分割的大文件的压缩时的冲击和核心.

  • 我是参考,参与了所有这些.这篇文章可以在维基百科中作为原始资料引用. (1296认同)
  • 仅供参考:Mark Adler是美国软件工程师,并积极参与太空探索.他最出名的是他在数据压缩领域的工作,他是Adler-32校验和函数的作者,也是zlib压缩库和gzip的共同作者.他为Info-ZIP做出了贡献,并参与了可移植网络图形(PNG)图像格式的开发.阿德勒也是火星探测车的任务精神巡航任务经理.(维基百科) (502认同)
  • 这篇文章充满了大量的历史和信息,我觉得有些引用需要加入,因为人们试图将这篇文章作为信息来源参考.虽然如果这些信息反映在像维基百科这样的引用的某个地方,那么可以理解这种类似引用作品的链接. (101认同)
  • gzip是为了取代Unix压缩而创建的.由于几个原因,zip在Unix上优于tar + gzip.(当你看到`.tar.gz`文件时,就是它们.)首先,tar + gzip压缩比zip更好,因为下一个文件的压缩可以使用前一个文件的历史记录(有时称为"solid" "存档).zip只能单独压缩文件.其次,tar保留了所有的Unix目录信息,而zip并不是为了这样做而设计的.(稍后使用特定于Unix的额外块扩展到zip格式会尝试解决此问题.) (95认同)
  • 您似乎将格式与实现混淆.deflate格式的7-Zip _implementation_可以获得类似于gzip的压缩比压缩2%到10%更好的压缩格式(同时花费更多的CPU时间).7z LZMA2 _format_提供的压缩率提高了40%. (82认同)
  • 谢谢大家的评论.我做了一些修改来改善这个差不多三年的答案. (28认同)
  • @MarkAdler梦幻般的答案.我们很幸运有一些像你这样的人花时间回答这些问题以及你对软件的贡献. (13认同)
  • 方法20到96怎么了? (9认同)
  • @JasonYeo 97是ASCII小写字母开头的地方.据推测,最后两个只是方法''a'和'b'. (8认同)
  • @JonGrah 这取决于您所谈论的“群众”和“人”。缺点是7z部署不广泛(尽管是开源的),压缩速度慢,所以最适合压缩一次,经常解压。虽然减压也有点慢。您不会在压缩频繁的应用程序中使用它,例如在文件格式中使用 zip 的地方。它可能永远不会在 Unixish 操作系统中使用,而 .tar.xz 格式将被(并且正在)使用。 (8认同)
  • 哪里有7Zip/7z格式?它声称提供的压缩比提高了2-10%. (7认同)
  • @JasonYeo打败了我.PKWare公司选择方法编号. (7认同)
  • @ nishantbhardwaj2002因为方法0不是自我终止的.长度必须_precede_数据,这意味着您需要在看到数据之前知道长度.对于流媒体应用来说,这是不可能的,因为没有先验长度信息,只有数据. (7认同)
  • ZIP over tar.gz的一个小优点是可以访问TOC而无需读取整个存档. (6认同)
  • 它做小块.事实上,你可以更好地在小块上进行霍夫曼编码压缩(但不能太小),因为整个流中数据的统计数据会发生变化.默认情况下,zlib每个块编码16K符号,其中符号是文字字节或长度/距离对. (5认同)
  • 目前尚不清楚为什么在已经开放的zip格式实现时开发了gzip格式.由于zip直接支持多个文件,因此它似乎优于gzip.那为什么gzip呢? (4认同)
  • 请注意,LZW 专利在 2003 年到期,所有涉及 GIF 的专利都在 2004 年底到期。 (4认同)
  • 不直接,没有.GPG使用zlib,因此它是最接近的. (2认同)
  • 关于格式与实现:也许这有助于解释产生某种格式的实例(压缩位串)的方法不止一种,以便解压缩以重现特定的解压缩位串。搜索更彻底(花费更多处理时间)的压缩器可以找到更短的压缩字符串。 (2认同)
  • "方法0不能流式传输,而方法8可以".为什么? (2认同)
  • @MarkAdler 和其他人,那么大众是否应该采用“.7z”作为标准 zip 格式,因为 a) 更好的压缩,b) 开源,c) 跨平台?人们切换到“7z”有什么*缺点*? (2认同)
  • 仅供参考:阿德勒还负责很多后备工作。由于他的 Adler-32 滚动校验和用于 Rsync (2认同)

Nie*_*jes 41

ZIP是一种文件格式,用于存储任意数量的文件和文件夹以及无损压缩.它没有对使用的压缩方法做出严格的假设,但最常用于DEFLATE.

Gzip既是基于DEFLATE的压缩算法,又是对潜在专利等的较少阻碍,以及用于存储单个压缩文件的文件格式.它支持在与tar结合使用时压缩任意数量的文件和文件夹.生成的文件的扩展名为.tgz.tar.gz通常称为tarball.

zlib是一个函数库,在最常见的LZ77版本中封装了DEFLATE .


Tim*_*ann 27

最重要的区别是gzip只能压缩单个文件,而zip会逐个压缩多个文件,然后将它们归档到一个文件中.因此,gzip大部分时间都伴随着tar(尽管还有其他可能性).这伴随着一些(dis)优势.

如果你有一个大的存档而你只需要一个单独的文件,你必须解压缩整个gzip文件才能获得该文件.如果您有zip文件,则不需要这样做.

另一方面,如果你压缩10个相似或甚至相同的文件,zip存档将会更大,因为每个文件都是单独压缩的,而在gzip中与tar结合使用时会压缩单个文件,如果文件是相似的(相等的).

  • 你夸大了这一点.如果人们想要随机访问压缩档案,他们可以创建".gz.tar"文件而不是".tar.gz"文件.他们没有,因为大多数人对随机访问不感兴趣..warc.gz网络存档格式有一个很大的社区,他们需要随机访问,因此他们分别压缩每个网页.每次查看Internet Archive Wayback Machine中的网页时都使用此格式. (7认同)
  • “ .gz.tar”不提供随机访问权限,因为tar格式无法随机访问其条目。您需要从头开始遍历所有条目,以得到一个特定的条目,甚至更糟:您需要遍历所有条目直到末尾,因为同一文件可能在多个位置被多次存档(具有多个版本)。在同一档案中-除逐项读取整个档案条目外,没有其他方法可以解决。 (2认同)