在我们日常使用计算机的时候,经常会使用到一些文件,这些文件以 .zip
, .rar
, .7z
结尾,这些文件就是压缩文件,我们可以通过资源管理器,WinRar,或者 7-zip 将其解压,然后进一步使用。
压缩软件应用非常广泛,比如我们如果使用 Office 2007 以及更高的版本保存 Word/PPT/Excel 文档时,这些文档实际上就是特殊的 ZIP 压缩文件,Word/PPT/Excel 的格式实际上就是将描述元素(文本框,标题…) 信息的 XML 文件,以及一些资源文件使用 Deflate(Fastest) 压缩算法压缩到一个 ZIP 格式文件中。另外,无论是 Java Jar 包,Windows UWP Appx 安装包,Android APK 包都使用了 ZIP 格式。也就是说,你通过 7z 程序也就可以打开了。
ZIP 是运用最广泛的压缩文件格式,在 Unix 世界,tar 格式则更受欢迎。
压缩文件历史悠久,zip/7z/rar 各种格式的轶闻颇多,压缩文件通常有两种策略,一种是像 ZIP 这种,压缩粒度是按文件划分,即文件头+压缩后的文件一个个的组合成一个文件,另一种是 tar.*
这类,先归档再压缩,即先将文件头+文件内容一个个组合,组合成一个文件后再进行压缩,两种策略各有优劣,比如前者能够方便的查看压缩文件的目录结构,后者能够提供更高的压缩比。但二者也有共同之处,压缩文件格式与算法并不是相同的概念,二者都能使用特定的压缩算法。
tar.*
格式文件通常是 tar 文件使用特定的压缩算法压缩而成,相应的表格如下:
后缀名 | 压缩算法 |
---|---|
tgz,tar.gz | GZIP (deflate) |
tar.bz2 | bzip2 |
tar.xz | lzma |
tar.sz | snappy |
tar.br | brotli |
tar.zst | zstd |
ZIP 压缩文件格式在文件头中会使用魔数标明压缩文件条目的压缩算法,相关的魔数(常用)如下( APPNOTE.TXT ):
压缩算法 | 魔数 | 备注 |
---|---|---|
Store | 0 | 存储目录 |
8 | deflate | 默认格式 |
9 | deflate64 | 与 deflate 类似,但字典要大一些,开源 ZIP 基本不支持 |
12 | bzip2 | |
14 | lzma | |
20 | zstd | |
96 | JPEG variant | |
97 | WavPack | |
98 | PPMd verson I, Rev 1 | |
99 | AE-x encryption marker |
我们可以看到虽然压缩文件的策略有很大的区别,但是还是可以使用相同的压缩算法, tar.*
结合压缩算法非常容易,但 ZIP 则涉及到规范文件反而没那么容易,所以最近 ZIP 格式规范才增加了 zstd 算法魔数,开源世界 zstd 也早已被广泛使用。
ZIP 的规范控制在 PKWARE 手中,但 WinZip 的影响力也非常大, WinZip 使用了 93 作为 ZIP-ZSTD 的魔数 ,这实际上会造成困扰。
2020-06-20 更新PKWARE 已经更新了 Zip 规则,魔数 20 已经被废弃,93 作为 ZIP-ZSTD 魔数。
压缩算法 | 魔数 | 备注 |
---|---|---|
Store | 0 | 存储目录 |
8 | deflate | 默认格式 |
9 | deflate64 | 与 deflate 类似,但字典要大一些,开源 ZIP 基本不支持 |
12 | bzip2 | |
14 | lzma | |
93 | zstd | |
96 | JPEG variant | |
97 | WavPack | |
98 | PPMd verson I, Rev 1 | |
99 | AE-x encryption marker |
在 baulk 中,baulk 内置了 ZIP 包的解压功能,使用 minizip 实现,但 minizip 并不支持 ZSTD,于是我今天就初步实现了未经足够测试的 ZIP-ZSTD 解压功能,在 Bali 中,也增加了生成使用 ZSTD 压缩的 ZIP 包的能力。并且我还给 archiver 提交了一个 PR,但 archiver 的 CI 应该出问题了。
这篇文章比较短,主要是最近事情比较多。