协慌网

登录 贡献 社区

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

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

答案

简写:

.zip是一种归档格式 ,通常使用Deflate 压缩方法.gz gzip 格式适用于单个文件,也使用 Deflate 压缩方法。 gzip 通常与tar结合使用,以生成压缩的归档格式 .tar.gzzlib 库提供了 Deflate 压缩和解压缩代码,供 zip,gzip, png (使用 defl 数据上的zlib 包装器 )和许多其他应用程序使用。

长表:

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 (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 小组编写了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.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 归档实用程序和 Google 的zopfli 库都能够比 zlib 使用更多的 CPU 时间,以便在使用 deflate 格式时挤出最后几位,与 zlib 相比,压缩大小减少了几个百分点压缩等级。 pigz 实用程序是 gzip 的并行实现,包括使用 zlib(压缩级别 1-9)或 zopfli(压缩级别 11)的选项,并通过在多个处理器上拆分大文件的压缩来稍微减轻使用 zopfli 的时间影响和核心。

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

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

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

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

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

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