zlib中使用的压缩算法与gzip和zip中的压缩算法基本相同。 什么是gzip和zip? 它们有何不同,它们是如何相同的?
简写:
.zip是一种归档格式,通常使用Deflate压缩方法。 .gz gzip格式适用于单个文件,也使用Deflate压缩方法。通常将gzip与tar结合使用以生成压缩归档格式.tar.gz。 zlib库提供了Deflate压缩和解压缩代码,供zip,gzip,png(使用defl数据上的zlib包装器)和许多其他应用程序使用。
长表:
ZIP格式是由Phil Katz开发的一种开放格式,具有开放式规范,其实现PKZIP是共享软件。它是一种存档格式,用于存储文件及其目录结构,其中每个文件都是单独压缩的。文件类型为.zip。可以选择加密文件以及目录结构。
ZIP格式支持多种压缩方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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 |
方法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小组编写了zip和unzip实用程序的可移植,免费,开源实现,支持使用Deflate格式进行压缩,以及对该格式和早期格式进行解压缩。这极大地扩展了.zip格式的使用。
在90年代早期,gzip格式是作为Unix compress实用程序的替代品而开发的,该实用程序源自Info-ZIP实用程序中的Deflate代码。 Unix compress旨在压缩单个文件或流,将.Z附加到文件名。 compress使用LZW压缩算法,该算法当时属于专利,其免费使用受到专利持有人的争议。虽然Deflate的一些具体实现是由Phil Katz申请专利的,但格式不是,所以有可能编写一个不侵犯任何专利的Deflate实现。在过去的20多年里,这种实施并未受到如此严峻的挑战。 Unix gzip实用程序旨在作为compress的替代品,实际上能够解压缩compress压缩数据(假设您能够解析该句子)。 gzip将.gz附加到文件名。 gzip使用Deflate压缩数据格式,它比Unix compress压缩得更好,具有非常快速的解压缩,并添加CRC-32作为数据的完整性检查。标头格式还允许存储比允许的compress格式更多的信息,例如原始文件名和文件修改时间。
虽然compress仅压缩单个文件,但通常使用tar实用程序将文件存档,其属性及其目录结构创建为单个.tar文件,然后使用制作.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格式的广泛使用,创建了两个免费的代码库。 libpng和zlib。 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归档实用程序和Google的zopfli库都能够比zlib使用更多的CPU时间,以便在使用deflate格式时挤出最后几位,与zlib相比,压缩大小减少了几个百分点压缩等级。 pigz实用程序是gzip的并行实现,包括使用zlib(压缩级别1-9)或zopfli(压缩级别11)的选项,并通过在多个处理器上拆分大文件的压缩来稍微减轻使用zopfli的时间影响和核心。
好。
-
对于zlib加密文件似乎没有常用的通用文件格式,例如gzip,我们有.gz文件。还是有吗?
-
不直接,没有。 GPG使用zlib,因此它是最接近的。
-
这篇文章充满了大量的历史和信息,我觉得有些引用需要加入,因为人们试图将这篇文章作为信息来源参考。虽然如果这些信息反映在像维基百科这样的引用的某个地方,那么可以理解这些类似引用作品的链接。
-
我是参考,参与了所有这些。这篇文章可以在维基百科中作为原始资料引用。
-
仅供参考:Mark Adler是美国软件工程师,并积极参与太空探索。他最出名的是他在数据压缩领域的工作,他是Adler-32校验和函数的作者,也是zlib压缩库和gzip的共同作者。他为Info-ZIP做出了贡献,并参与了可移植网络图形(PNG)图像格式的开发。阿德勒还是火星探测车的任务精神巡航任务经理。 (维基百科)
-
目前尚不清楚为什么在已经开放的zip格式实现时开发了gzip格式。由于zip直接支持多个文件,因此它似乎优于gzip。那为什么gzip呢?
-
gzip是为了取代Unix压缩而创建的。由于几个原因,zip并不优于Unix上的tar + gzip。 (当你看到.tar.gz文件时,就是它们。)首先,tar + gzip压缩比zip更好,因为下一个文件的压缩可以使用前一个文件的历史记录(有时称为"实体"存档) 。 zip只能单独压缩文件。其次,tar保留了所有的Unix目录信息,而zip并不是为了这样做而设计的。 (稍后使用特定于Unix的额外块扩展到zip格式会尝试解决此问题。)
-
哪里有7Zip / 7z格式?它声称提供的压缩比提高了2-10%。
-
您似乎将格式与实现混淆。 deflate格式的7-Zip实现可以得到类似于gzip的压缩比压缩格式高2%到10%(同样的deflate格式)(同时花费更多的CPU时间)。 7z LZMA2格式的压缩率提高了40%。
-
方法20到96怎么了?
-
ZIP over tar.gz的一个小优点是可以访问TOC而无需读取整个存档。
-
@JasonYeo打败了我。 PKWare公司选择方法编号。
-
@JasonYeo 97是ASCII小写字母开头的地方。据推测,最后两个只是方法'a'和'b'。
-
只是注意,LZW专利于2003年到期,所有涉及GIF的专利均于2004年底到期。
-
您可能需要添加一个关于Zopfli的注释,这是一种来自Google的deflate兼容慢速压缩/快速解压缩算法(也可用于PNG)
-
@jmtd这是一个优点,它位于tar + gz组合的tar层中。您可以通过压缩文件然后将它们放在tar存档中来近似这一点,但由于这不是自动支持的,因此它不是那么方便(但可能,并且可以使用非常简单的实用程序或shell脚本抽象出来)。
-
关于格式与实现:可能有助于解释生成某种格式的实例(压缩位串)的方法不止一种,以便它解压缩以再现特定的解压缩位串。压缩程序搜索得更彻底(占用更多的处理时间)可以找到更短的压缩字符串。
-
谢谢大家的评论。我做了一些修改来改善这个差不多三年的答案。
-
"方法0不能流式传输,而方法8可以"。为什么?
-
@ nishantbhardwaj2002因为方法0不是自我终止的。长度必须在数据之前,这意味着您需要在看到数据之前知道长度。对于流媒体应用来说,这是不可能的,因为没有先验长度信息,只有数据。
-
@MarkAdler如果我有一个新的方法-x没有压缩并且可以通过使用EOF标记进行流式处理,那么在方法-0中使用长度在数据之前有什么好处? (它与使用EOF标记的事实有关,我们需要考虑出现在文件数据中的相同标记的出现,这使得方法0在它可以原样使用的情况下简单快速)
-
@MarkAdler DEFLATE(LZ77 +霍夫曼编码)压缩算法如何流式传输?使用方法-8的zip格式,zip中的每个文件都是单独压缩的。在霍夫曼编码中,我们需要为整个数据创建树,所以在我们开始将zip压缩到输出之前,是否需要分析整个文件-1?或者它是基于处理小块数据(不管文件)而不是处理整个单独文件?
-
它做小块。事实上,你可以更好地在小块上进行霍夫曼编码压缩(但不能太小),因为整个流中数据的统计数据会发生变化。默认情况下,zlib每个块编码16K符号,其中符号是文字字节或长度/距离对。
-
@MarkAdler梦幻般的答案。我们很幸运有一些像你这样的人花时间回答这些问题以及你对软件的贡献。
-
@MarkAdler和其他人,那么大众应该采用.7z作为标准的zip格式,因为a)更好的压缩,b)开源,c)跨平台?人们切换到7z有什么不利之处?
-
@JonGrah这取决于你所谈论的"群众"和"人"。缺点是7z没有被广泛部署(尽管是开源的),并且压缩缓慢,因此最适合压缩一次,经常解压缩。虽然减压也有点慢。您不会在频繁压缩的应用程序中使用它,例如您在哪里看到以文件格式使用的zip。它可能永远不会在Unixish操作系统中使用,而.tar.xz格式将被(而且)使用。
ZIP是一种文件格式,用于存储任意数量的文件和文件夹以及无损压缩。它没有对使用的压缩方法做出严格的假设,但最常用于DEFLATE。
Gzip既是基于DEFLATE的压缩算法,又是对潜在专利等的较少阻碍,以及用于存储单个压缩文件的文件格式。它支持在与tar结合使用时压缩任意数量的文件和文件夹。生成的文件的扩展名为.tgz或.tar.gz,通常称为tarball。
zlib是一个函数库,在最常见的LZ77版本中封装了DEFLATE。
最重要的区别是gzip只能压缩单个文件,而zip会逐个压缩多个文件,然后将它们归档到一个文件中。
因此,gzip大部分时间都伴随着tar(尽管还有其他可能性)。这伴随着一些(dis)优势。
如果你有一个大的存档而你只需要一个单独的文件,你必须解压缩整个gzip文件才能获得该文件。如果您有zip文件,则不需要这样做。
另一方面,如果你压缩10个相似或甚至相同的文件,zip存档将会更大,因为每个文件都是单独压缩的,而在gzip中与tar结合使用时会压缩单个文件,如果文件是相似的(相等的)。
-
你夸大了这一点。如果人们想要随机访问压缩档案,他们可以创建".gz.tar"文件而不是".tar.gz"文件。他们没有,因为大多数人对随机访问不感兴趣。 .warc.gz网络存档格式有一个很大的社区,他们需要随机访问,因此他们分别压缩每个网页。每次查看Internet Archive Wayback Machine中的网页时都使用此格式。
-
".gz.tar"不提供随机访问,因为tar格式无法随机访问其条目。您需要从头开始查看所有条目以获得所需的特定条目,更糟糕的是:您需要遍历所有条目直到结束,因为同一文件可能会在多个位置存档多次(在多个版本中)在同一档案中 - 除了通过条目阅读整个档案条目之外,没有办法解决它。