46

文件压缩杂谈

 3 years ago
source link: http://forcemz.net/file/2020/06/14/TalkingFileCompression/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言

年纪渐长,朋友们相聚愈发的不容易,本想周末约一二好友饕餮一番,奈何鹦鹉将至,遂二日居家,忽见 ZSTD 算法已入 ZIP 规范,便写了一二日代码。

压缩文件

压缩文件历史悠久,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 的魔数 ,这实际上会造成困扰。

ZIP 的 ZSTD 算法支持

baulk 中,baulk 内置了 ZIP 包的解压功能,使用 minizip 实现,但 minizip 并不支持 ZSTD,于是我今天就初步实现了未经足够测试的 ZIP-ZSTD 解压功能,在 Bali 中,也增加了生成使用 ZSTD 压缩的 ZIP 包的能力。并且我还给 archiver 提交了一个 PR,但 archiver 的 CI 应该出问题了。

最后

这篇文章比较短,主要是最近事情比较多。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK