打包和压缩格式介绍
打包(pack)就是将将多个文件合并为一个文件,他的反过程就是解包(unpack)。压缩(compression)就是将一个文件的存储体积减小,她的反过程就是解压缩(uncompression)。
打包和压缩格式
目前主流的打包格式有四个(这里主要介绍对文本和二进制的打包和压缩,实际上图片、音频等格式都属于这个范畴):
zip
: 目前看来已经逐渐疲软,不过作为最早的自由开源的打包压缩格式被广泛的支持tar
: Linux 下最常用的打包工具,结合不同的压缩算法出现了 tar.gz、tar.xz 等多衍生格式rar
: 著名的商业软件,他的解码器是免费的(并不开源),编码器是收费的,其压缩率高以及具有错误恢复记录等功能也被广泛使用7zip
: 新一代的打包压缩功能,他解决了 zip 的一些痛点,最大的成就是为开源社区带来了 lzma 压缩算法
这里需要明确一下打包和压缩,上面所有的格式实际上都算是一个打包格式,只不过在这个基础上进行了压缩:
- zip: 他可以使用不同的压缩算法(默认是 Deflate)来对文件进行压缩,之后将压缩的文件打包。这种压缩打包方式可以很方便地进行流处理,但是由于压缩是针对于单个文件的,所以压缩率不高
- tar: 他只是简单的将文件进行打包,打包后的文件作为一个整体来压缩,实际上的压缩文件通常为
tar.gz(Deflate)
、tar.xz(LZMA)
等 - 7z: 同样是对文件进行整体压缩,好处就是压缩率高,但是也不在能够流式处理了
zip 由于最早出现且开源免费也是使用最为广泛的,但是他由于没有定义标准编码(windows 下的 zip 如果包含中文在 linux 下会乱码),时间戳精度有问题,原生无法支持超过 4G 的文件(需要 zip64 支持),文件单独压缩压缩率不高等等痛点。而 7z 这个新一代的打包压缩工具的出现对 zip 的这些痛点都进行了解决,并且提供了更高地压缩比算法(LZMA)。不过生不逢时,在这个存储和带宽越来越不值钱的现在 7z 想要称为主流挺难。
Note
tar 能够保留 mode 信息,所以几乎是 unix-like 系统分发文件的唯一打包格式
压缩算法简史
目前主流的压缩算法包含以下几个:
- Deflate: 开源免费,zip、gzip、zlib 以及 png 都是构建在他之上的,tar 使用 gzip 工具来提供 Deflate 压缩后缀是
.gz
- LZW: gif 和 Unix compress 工具使用,最初是有版权的,目前已经过期,tar 后缀
.Z
- bzip2: 比 gzip(Deflate) 压缩率更高且解压速度更快,tar 后缀
.bz2
- LZMA: 由 7z 开发的算法,开源免费,tar 后缀
.xz
- Zstandard(Zstd): Facebook 开发的一个压缩算法,他最大的特点就是在保证压缩比(类似Deflate)的同时能够非常快速的解压缩,tar后缀
.zst
- Snappy: Google 开源的压缩算法,由于其解压缩速度非常快通常用于对速度比较敏感的地方(网络传输、数据库传输等)
zip 诞生记
1985 年一家名为 SEA 的小公司开发了一个在 MS-DOS 平台下的商业压缩软件,名为 ARC。当时的卡茨与很多用计算机的平民一样,缺乏资金购买商业软件,当时卡茨从网上下载了一份 ARC 的 C 语言源代码,并用汇编语言将其全新编写并编译出来。卡茨将这个软件名为:PKARC(Phillip Katz' ARC)。卡茨当时将这个新软件上传到网络上面。显然,卡茨此举造成对 SEA 公司的侵权。最终,双方对簿公堂,结果是卡茨败诉,卡茨被判以对 SEA 公司的赔款以及停止发放 PKARC。后来,卡茨就制作出新压缩软件 PKZIP(Phillip Katz' ZIP),这款全新的软体比 ARC 的压缩率、压缩性能都要高许多,并且包含更多功能。此后,卡茨还将 ZIP 的所有技术参数公诸于众。
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 # 使用 deflate 压缩
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 # 使用 bzip2 压缩
13 - Reserved by PKWARE
14 - LZMA # 使用 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 是后来新加的,在老的工具中可能无法使用。所以真正被广泛使用的就是方法 8 即基于 Deflate 来进行压缩。像使用 zip 进行归档的.jar .xlsx .docx .pptx .epub
等等都将其限制为 0 和 8。
Note
最初的 PKZIP 是用于 MS 平台的,1990 年 info-zip 开源组织编写了开源的 zip 和 unzip 工具将他们引入了 Unix
gzip 诞生记
最初 Unix 上使用最为广泛的压缩工具是使用 LZW 算法的 Unix Compress,由 LZW 是有专利的(目前已经过期)不够 free 。并且此时 info-zip 已经开发了用于 Unix 平台的 Deflate 压缩算法,基于此开源社区出现了gzip(gunzip),它使用 Deflate 并添加了一个 CRC-32 头信息,这一度在 Linux 上作为主流使用(tar.gz)。
png 来袭
就像 gzip 是为了避免使用 LZW 这个具有专利的算法一样,gif 同样使用 LZW 压缩算法也陷入了这种困境。于时使用 Deflate 算法的更加开放的 png 图片格式出现了。并且该项目还带来了 libpng 和 zlib 这两个 C 语言库。
Tips
可以看到 Deflate 几乎是最初开源世界压缩算法的基石,伟大的 Phillip Katz
Tips
zlib 和 gzip 虽然同样都是使用 Deflate 算法,不过 gzip 会添加头信息因此不能直接使用 zlib 解压,当然 zlib 提供了参数wbitz > 16
时会添加 gzip 头
后起之秀
网络的兴起,很多商业逻辑也发生了改变更多的压缩算法都以开源发布,其中比较著名的后起之秀包含 lzma、Snappy 等。目前 Linux 很多发布都使用了 lzma 即 tar.xz 来共享。而 Snappy 则用于对压缩和解压缩速度敏感的需求上,很多基于磁盘的数据库为了效率默认使用的就是 Snappy。