当前位置: 首页 > 知识库问答 >
问题:

zlib、gzip和zip是如何关联的?他们有什么共同点,又有什么不同?

明松
2023-03-14

zlib中使用的压缩算法与gzip和zip中的压缩算法本质上是相同的。什么是gzip和zip?它们有何不同,又有何相同?

共有2个答案

百里伟
2023-03-14

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

Gzip既是一种基于DEFLATE的压缩算法,也是一种用于存储单个压缩文件的文件格式。当与tar结合时,它支持压缩任意数量的文件和文件夹。结果文件的扩展名为.tgz.tar.gz,通常称为tarball。

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

松雅昶
2023-03-14

简体:

.zip是一种存档格式,通常使用Deflate压缩方法。.gzgzip格式用于单个文件,也使用Deflate压缩方法。gzip通常与tar结合使用,以形成压缩存档格式.tar.gz。zlib库提供了Deflate压缩和解压缩代码,供zip、gzip、png(在Deflate数据上使用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
   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:20 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格式是作为Unixcompress实用程序的替代而开发的,后者源自Info-ZIP实用程序中的Deflate代码。Unix的compress设计用于压缩单个文件或流,并在文件名后附加.zcompress使用的是LZW压缩算法,该算法当时属于专利范围,专利持有者对其免费使用存在争议。虽然Deflate的一些特定实现由Phil Katz申请了专利,但格式却没有,因此可以编写一个不侵犯任何专利的Deflate实现。在过去20多年里,这一执行工作没有受到如此大的挑战。Unixgzip实用工具的目的是作为compress的附带替换,实际上能够解压缩compress压缩的数据(假设您能够解析该语句)。gzip在文件名后附加.gzgzip使用Deflate压缩数据格式,这种格式比Unixcompress的压缩效果要好得多,解压速度非常快,并且添加了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。该格式还使用压缩格式进行压缩,在图像数据上的滤波器暴露出更多的冗余后应用该压缩格式。为了推广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运行得更快。读写.zip格式的程序使用原始deflate格式,该格式是环绕deflate压缩数据的另一种格式。

zlib在数据传输和存储方面得到了广泛的应用。例如,服务器和浏览器的大多数HTTP事务都使用zlib压缩和解压缩数据,特别是HTTP headercontent-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的时间影响。

 类似资料:
  • 本文向大家介绍请简要说明一下JSP和Servlet有哪些相同点和不同点?另外他们之间的联系又是什么呢?相关面试题,主要包含被问及请简要说明一下JSP和Servlet有哪些相同点和不同点?另外他们之间的联系又是什么呢?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JSP   JSP 是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是”类servl

  • 在另一个关于将字符串作为字符数组进行单步执行的线程中,提示这个问题的具体注释是“注意,此技术给您的是字符,而不是代码点,这意味着您可能获得代理项。”我不是真的理解,所以我想最好是在一个新的问题中要求澄清,而不是对一个5年前的问题进行一系列的评论。

  • 我刚刚了解到python中有truthy和falsy值,它们不同于正常的和。 有人能深入解释什么是真实和虚假的价值观吗?我应该在哪里使用它们?truthy和值与falsy和值之间有什么区别?

  • 本文向大家介绍flex与其他有什么不同,用它有什么好处?相关面试题,主要包含被问及flex与其他有什么不同,用它有什么好处?时的应答技巧和注意事项,需要的朋友参考一下 flex 从根本上不同于之前常用的借助 定位、浮动 的布局。从逻辑思路上来说,flex 布局具有宏观性,提供了一种对于页面中元素如何排布的框架,开发者不需要关注细节和进行额外的操作,就能使得一系列元素按约定的规则排列。而之前常用的借

  • 个人背景: 一个前端新人,在了解 session 和 cookie 的时候,联想到了前端常用的存储, sessionStorage 。 问题: 这两个东西有相关联的地方吗?还是只是名字相似,但是两个完全不同的概念?

  • 问题内容: 我正在尝试对术语“字符”,“代码点”和“代理”进行解释,尽管这些术语不仅限于Java,但如果存在特定于语言的差异,我希望将其解释为它与Java有关。 我发现了一些有关字符和代码点之间差异的信息,字符是为人类用户显示的内容,代码点是对该特定字符进行编码的值,但是我不知道代理。什么是代理,它们与字符和代码点有何不同?我对字符和代码点是否有正确的定义? 在另一个关于将字符串作为字符数组步进的