zlib、gzip和zip有什么关系?它们有什么共同点和区别?

1253

zlib 中使用的压缩算法本质上与 gzipzip 中的相同。那么 gzipzip 是什么?它们有何不同之处,又有何相同之处?

3个回答

3153

简短形式:

.zip 是一种通常使用{{link2:Deflate压缩方法的存档格式。.gz gzip格式用于单个文件,也使用Deflate压缩方法。通常gzip与tar结合使用以创建压缩的存档格式,即.tar.gzzlib库提供了用于zip、gzip、png(使用zlib包装器处理deflate数据)和许多其他应用程序的Deflate压缩和解压缩代码。

长形式:

ZIP格式是由Phil Katz开发的一种开放格式和开放规范,他的实现方式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
   15 - Reserved by PKWARE
   16 - IBM z/OS CMPSC Compression
   17 - Reserved by PKWARE
   18 - File is compressed using IBM TERSE (new)
   19 - IBM LZ77 z Architecture 
   20 - deprecated (use method 93 for zstd)
   93 - Zstandard (zstd) Compression 
   94 - MP3 Compression 
   95 - XZ Compression 
   96 - JPEG variant
   97 - WavPack compressed data
   98 - PPMd version I, Rev 1
   99 - AE-x encryption marker (see APPENDIX E)

方法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 Document Format文件(.odt、.ods、.odp)和EPUB文件(.epub)中使用。该标准限制了压缩方法为0和8,以及其他约束,如无加密或签名。

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

在90年代初,gzip格式作为Unix compress实用程序的替代品而开发出来,它是从Info-ZIP实用程序中的Deflate代码派生而来的。Unix compress旨在压缩单个文件或流,并在文件名后附加一个.Zcompress使用了当时正在受专利保护且其免费使用权受到专利持有人争议的LZW压缩算法。尽管Phil Katz对Deflate的某些具体实现进行了专利申请,但该格式并未受到专利保护,因此可以编写一种不侵犯任何专利的Deflate实现。在过去的20多年中,该实现从未受到挑战。Unix gzip实用程序旨在成为compress的即插即用替代品,实际上它能够解压缩compress压缩的数据(假设您能够解析该句子)。gzip在文件名后附加一个.gzgzip使用了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问世后不久,大约在1990年代中期,同样的专利纠纷对广泛应用于公告板和万维网(当时的新事物)上的.gif图像格式的免费使用提出了质疑。因此,一个小团队创建了无损压缩的PNG图像格式,文件类型为.png,以取代.gif。该格式也使用了Deflate格式进行压缩,在图像数据上的滤波器暴露出更多的冗余后应用。为了促进广泛使用PNG格式,创建了两个免费的代码库。libpng处理了PNG格式的所有功能,而zlib为libpng提供了压缩和解压缩代码,以及其他应用程序使用的代码。zlib是从gzip代码改编而来。
所有提到的专利现已过期。
zlib库支持Deflate压缩和解压缩,以及三种包装方式。这些包括没有包装("raw" deflate),zlib包装,用于PNG格式数据块,以及gzip包装,为程序员提供gzip例程。zlib包装和gzip包装的主要区别在于,zlib包装更紧凑,只有六个字节,而gzip至少需要18个字节,并且完整性检查Adler-32比gzip使用的CRC-32更快。原始deflate用于读写.zip格式的程序,这是另一种包装deflate压缩数据的格式。
zlib现在广泛用于数据传输和存储。例如,大多数服务器和浏览器通过zlib压缩和解压缩数据进行HTTP事务,具体来说,HTTP头部Content-Encoding: deflate表示zlib数据格式内部包装的deflate压缩方法
不同的deflate实现可能会导致相同输入数据的不同压缩输出,这可以通过存在可选择的压缩级别来证明,这些级别允许在压缩效果和CPU时间之间进行权衡。zlib和PKZIP并不是deflate压缩和解压缩的唯一实现。7-Zip归档实用程序和Google的zopfli库都能够使用比zlib更多的CPU时间,以便在使用deflate格式时尽可能地挤出最后几个比特,将压缩大小减少几个百分点,相比于zlib的最高压缩级别。pigz实用程序是gzip的并行实现,包括使用zlib(压缩级别1-9)或zopfli(压缩级别11)的选项,并通过将大文件的压缩分配给多个处理器和核心来在一定程度上减轻使用zopfli的时间影响。

177
这篇文章包含了很多历史和信息,我感觉需要添加一些引用文献,以防止读者将这篇文章作为信息来源进行引用。不过如果这些信息已经在像维基百科这样带有引用文献的地方被反映出来,那么提供一个指向这样类似引用工作的链接会是很不错的。 - ThorSummoner
1817
我是参与其中的人,可以作为参考。这篇文章可以被引用为维基百科上的原始来源。 - Mark Adler
683
FYI:Mark Adler是一位美国软件工程师,深度参与了太空探索。他以数据压缩领域的工作而闻名,是Adler-32校验函数的作者,也是zlib压缩库和gzip的联合作者。他还为Info-ZIP做出了贡献,并参与开发了便携式网络图形(PNG)图像格式。Adler还担任过火星探测漫游者任务的“精神号”巡航任务经理。(维基百科) - Isaac Hanson
133
gzip 诞生的目的是为了取代 Unix 的 compress 。在 Unix 系统上,tar + gzip 比 zip 压缩更好,原因如下:当你看到 ".tar.gz" 文件时,它们就是这种格式。首先,tar + gzip 比 zip 压缩更好,因为下一个文件的压缩可以使用前一个文件的历史记录(有时称为“固态”存档)。zip 只能单独压缩文件。其次,tar 保留了所有的 Unix 目录信息,而 zip 并不设计这样做。(后来针对 Unix 的扩展块尝试解决这个问题。) - Mark Adler
115
你似乎把格式和实现混淆了。7-Zip使用的deflate格式的_实现_可以比gzip使用的同样的deflate格式获得更好的压缩率,可以高达你引用的2%到10%(但需要更多的CPU时间来完成)。而7z LZMA2 格式 可以获得40%左右的更好压缩率。 - Mark Adler
显示剩余26条评论

62

ZIP是一种文件格式,用于存储任意数量的文件和文件夹,并进行无损压缩。它并不严格假设压缩方法,但最常与DEFLATE一起使用。

Gzip既是基于DEFLATE的压缩算法,但没有受到潜在专利等的限制,也是用于存储单个压缩文件的文件格式。当与tar结合使用时,它支持压缩任意数量的文件和文件夹。生成的文件扩展名为.tgz.tar.gz,通常称为tarball

zlib是一个函数库,封装了DEFLATE最常见的LZ77表现形式。


40

最重要的区别是gzip只能压缩单个文件,而zip会逐个压缩多个文件并将它们存档到一个单一的文件中。 因此,gzip大多数情况下都需要与tar一起使用(虽然还有其他可能性)。这带来了一些优点和缺点。

如果您有一个大的归档文件,并且只需要其中一个文件,您必须解压整个gzip文件才能获取该文件。如果您有一个zip文件,则不需要这样做。

另一方面,如果您压缩10个相似或甚至相同的文件,zip归档文件会更大,因为每个文件都是单独压缩的,而在gzip与tar结合时,只压缩一个文件,如果文件相似(相等),则效果更好。


12
你夸大了这个观点。如果人们想要随机访问压缩档案,他们可以创建“.gz.tar”文件而不是“.tar.gz”文件。他们不这样做是因为大多数人对随机访问并不那么感兴趣。.warc.gz网络存档格式有一个庞大的社区,他们需要随机访问,因此会将每个网页单独压缩。每当你在Internet Archive Wayback Machine中查看网页时,就会使用这种格式。 - Greg Lindahl
12
".gz.tar"格式不支持随机访问,因为tar格式不能随机访问其条目。要获取特定的条目,您需要从开头逐个浏览所有条目,更糟糕的是:您需要一直浏览到结尾,因为同一文件可能会以几个版本的形式多次归档在同一存档中的不同位置 - 除了逐个读取整个存档条目之外,没有其他方法可以找出这个问题。 - Min-Soo Pipefeet
1
@Min-SooPipefeet 对,因为 tar 的意思是“磁带归档”,而且(除非你在玩DECtape之类的东西)磁带本身就是顺序的! - RonJohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接