zlib,gzip和zip有何关系?它们有什么共同点,有何不同?


Answers:


2476

简写:

.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

方法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)格式化文件(.odt,.ods,.odp)和EPUB文件(.epub)。该标准将压缩方法限制为0和8,以及其他限制,例如没有加密或签名。

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

在90年代初期,gzip格式被开发为Unix compress实用程序的替代,它是从Info-ZIP实用程序中的Deflate代码衍生而来的。Unix compress旨在压缩单个文件或流,.Z并在文件名后附加a 。 compress使用LZW压缩算法,该算法当时处于专利保护之下,其免费使用受到专利持有人的争议。尽管Deflate的某些特定实现已由Phil Katz申请了专利,但该格式没有,因此可以编写不侵犯任何专利的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文件中列出。

在1990年中期左右引入gzip之后不久,同一宗专利纠纷就引发了人们对免费使用.gif图片格式的质疑,该图片格式在公告板上和万维网上使用非常广泛(当时是新事物)。因此,一个小组创建了PNG无损压缩图像格式(文件类型为.png)来替换.gif。该格式还使用Deflate格式进行压缩,该格式是在图像数据的过滤器公开更多冗余之后应用的。为了促进PNG格式的广泛使用,创建了两个免费代码库。 libpngzlib。libpng处理了PNG格式的所有功能,而zlib提供了压缩和解压缩代码,供libpng和其他应用程序使用。zlib是从gzip代码改编而成的。

此后所有提及的专利均已过期。

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

zlib现在广泛用于数据传输和存储。例如,服务器和浏览器进行的大多数HTTP事务都使用zlib压缩和解压缩数据,特别是HTTP标头Content-Encoding: deflate意味着压缩封装在zlib数据格式内的压缩方法

放气的不同实现方式可能导致相同输入数据的不同压缩输出,这由可选压缩级别的存在证明,这些压缩级别允许在CPU时间上权衡压缩效率。zlib和PKZIP并不是deflate压缩和解压缩的唯一实现。无论是7-ZIP归档工具和谷歌的zopfli库必须使用deflate格式时,为了挤掉可能最后几位用更多的CPU时间比zlib的能力,百分之几减少压缩尺寸相比zlib的最高压缩级别。该pigz工具,是gzip的并行实现,包括使用zlib(压缩级别1-9)或zopfli(压缩级别11)的选项,并且通过在多个处理器和内核上拆分大型文件的压缩,在某种程度上减轻了使用zopfli的时间影响。


113
这篇文章包含了太多的历史和信息,我觉得需要添加一些引文,以防人们尝试引用此文章作为信息源。尽管如果通过Wikipedia等引用在某处反映了此信息,则可以引用此类类似参考文献的链接。
ThorSummoner

1348
我是所有方面的参考。这篇文章可以在Wikipedia中引用为原始来源。
Mark Adler

524
仅供参考:Mark Adler是一位美国软件工程师,并且一直参与太空探索。作为Adler-32校验和函数的作者,以及zlib压缩库和gzip的合著者,他以在数据压缩领域的工作而闻名。他为Info-ZIP做出了贡献,并参与了可移植网络图形(PNG)图像格式的开发。阿德勒(Adler)还是火星探索漫游者(Murs Rover Rover)任务的精神巡航任务经理。(维基百科)
艾萨克·汉森

99
创建了gzip来替换Unix压缩。出于某些原因,zip 在Unix上并不优于tar + gzip。(当您看到.tar.gz文件时,就是这样。)首先,tar + gzip的压缩比zip更好,因为下一个文件的压缩可以使用上一个文件的历史记录(有时称为“可靠”存档)。zip只能单独压缩文件。其次,tar保留所有Unix目录信息,而zip并非旨在做到这一点。(后来使用特定于Unix的额外块对zip格式进行了扩展,试图解决此问题。)
Mark Adler

85
您似乎将格式与实现混淆了。deflate格式的7-Zip 实现比使用相同deflate格式的gzip可获得比您引用的2%至10%更好的压缩率(同时花费更多的CPU时间)。7z LZMA2 格式的压缩率提高了40%左右。
Mark Adler

43

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

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

zlib是将DEFLATE封装在其最常见的LZ77化身中的函数库。


28

最重要的区别是,gzip仅能压缩单个文件,而zip则可以一个接一个地压缩多个文件,然后将它们归档到一个文件中。因此,gzip大多数时候都与tar一起出现(不过还有其他可能性)。这伴随着一些(不利)优势。

如果存档很大,而只需要一个文件,则必须解压缩整个gzip文件才能找到该文件。如果您有zip文件,则不需要这样做。

另一方面,如果您压缩10个相似甚至相同的文件,则zip存档会更大,因为每个文件都是单独压缩的,而在与tar结合使用gzip的情况下,单个文件将被压缩,如果文件被压缩,则效率会更高。类似(相等)。


8
您高估了这一点。如果人们需要随机访问的压缩档案,则可以创建“ .gz.tar”文件而不是“ .tar.gz”文件。他们没有,因为大多数人对随机访问并不感兴趣。.warc.gz Web归档格式周围有一个很大的社区,它们需要随机访问,因此它们分别压缩每个网页。每次在Internet Archive Wayback Machine中查看网页时,都使用此格式。
格雷格(Greg Lindahl),2016年

2
“ .gz.tar”不提供随机访问权限,因为tar格式无法随机访问其条目。您需要从头开始遍历所有条目,以得到一个特定的条目,甚至更糟:您需要遍历所有条目直到末尾,因为同一文件可能在多个地方被多次存档(有多个版本)。在同一档案中-除逐项读取整个档案条目外,没有其他方法可以解决。
Min-Soo Pipefeet '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.