技术

DEFLATE 是什么:为什么 ZIP、PNG、gzip 都用它

📅 2026-08-25 · ✍️ 闪压团队 · ⏱ 6 分钟阅读

桌面压缩用户经常会注意到,ZIP 文件、PNG 图片、gzip 网页传输、ZIP 的兄弟 7Z 的某些模式——背后其实都共享着同一种核心编码思路:DEFLATE。它不是某个公司发明的黑科技,而是一种"两阶段压缩流水线"的范式范本:先做字典编码去重复,再做熵编码压比特。理解 DEFLATE,你就理解了现代无损压缩最主流的一条主干道。

一、DEFLATE 不是算法,是"配方"

DEFLATE 本身不是一种新的压缩数学发明,而是一份工程规范——规定了"先用什么方法找重复,再用什么方法压比特"。这种"两阶段流水线"思想是 DEFLATE 的精髓。

第一阶段叫字典编码(也叫"滑动窗口"或"LZ77 系"),目标是把数据里的重复片段替换成"我之前见过这个"。第二阶段叫熵编码,目标是把第一阶段输出的符号(匹配距离、匹配长度、字面字符)用尽量少的比特表达出来。

打个比方:字典编码像在读一本重复词很多的小说时,把第二次出现的"魔法师"替换成"前面那个戴尖帽的"。熵编码则是给小说里真正出现的所有"符号"做统计,经常出现的给短编码,罕见的给长编码,这样整本书的总字数就降下来了。

DEFLATE 规范里,字典编码部分必须是 LZ77 或其近亲 LZSS(滑动窗口 + 最长匹配查找),熵编码部分可以选择 霍夫曼编码或者动态霍夫曼(规范里给了两种模式)。

二、第一阶段:字典编码做什么

字典编码的核心问题是:数据里重复出现的内容怎么记录? 比如一段文档里同一个词出现十次,是把这个词原样写十遍省事,还是把第一次写下来、后面九次只记"在前面 X 位置出现过"省事?

LZ77 的做法是维护一个滑动窗口:当你读到第 N 个字符时,你能在它前面一定范围内(比如三万多个字节)找到的最长相同串,就记成"<往回走 N 字节,复制 M 字节长度>"。原始数据被替换成了"指针 + 字面字符"这种混合流。

这一步并不是无损压缩的完成——它只是把数据改写成了更利于后续熵编码的形式。因为它把"重复"显式编码了,后续的熵编码器才能看到这些"距离+长度"组合的统计规律。

字典编码是 DEFLATE 能"复用 ZIP/PNG/gzip"的关键。这三者都用 LZ77 找重复,所以一旦你理解了滑动窗口,就理解了这三个格式的"前半段"。

三、第二阶段:熵编码做什么

字典编码的输出是一串混合符号:字面字符、距离、长度。问题来了——怎么把这串符号写进磁盘/网线,占用最少字节?

这就是熵编码的工作。熵编码的逻辑是:出现概率高的符号用短编码,出现概率低的符号用长编码,总体平均下来,比特数就降了。

DEFLATE 支持两种熵编码:

  • 静态霍夫曼:用一张写死的概率表编码,简单快速,适合对小文件省事。
  • 动态霍夫曼:编码器先扫描数据,统计出"这次的字面字符、距离、长度"各自的实际频率,据此生成一张自定义的霍夫曼树写进输出流。压缩率更高,但多了一段"表头"开销,所以对极小的文件不一定划算。

熵编码的精妙在于:它不在乎符号本身是什么,只在乎符号出现的频率。这让 DEFLATE 有了"自适应"的能力——对英文文档、英语源代码、HTML、二进制日志,都能找出相应的频率规律来压。

四、为什么 ZIP/PNG/gzip 都选了 DEFLATE

ZIP 格式诞生后,需要一种通用且高效的压缩引擎。DEFLATE 的吸引力在于:

第一,实现门槛低。字典编码 + 熵编码两阶段都是成熟的算法,任何团队都能在合理时间内写出来。历史上很多早期压缩工具之所以能快速支持 ZIP,就是因为 DEFLATE 规范清晰。

第二,压缩率与速度的平衡好。单纯追求压缩率,可以用更复杂的预测模型(如 PPM),但速度慢、不适合日常使用;单纯追求速度,可以用简单的固定编码,但压缩率差。DEFLATE 在两者之间找了一个工程甜点。

第三,专利清晰。DEFLATE 选用的 LZ77 + 霍夫曼组合避开了当时一些专利限制,任何人都能自由实现。这也是它能被广泛采用的法律基础。

PNG 选 DEFLATE 是因为图片无损压缩需要一种"通用"引擎:不同类型的图像数据(线条图、照片、图标)都能用同一套流程压。gzip 选 DEFLATE 是因为网页传输要兼顾压缩率、速度和兼容性,DEFLATE 全都满足。

五、DEFLATE 的边界与替代者

DEFLATE 也有局限。它基于"滑动窗口"找重复,**对于已经高度压缩过的数据(比如 JPG 视频、ZIP 文件、加密文件)**几乎压不动——因为这些数据里几乎没有可识别的重复模式。

另一个局限是它的字典编码段是串行的:必须从头到尾扫一遍找匹配。这在多核 CPU 时代成了性能瓶颈,也推动了后续 Zstandard、LZ4 等新算法:它们在保持 LZ77 思想精髓同时,引入更好的窗口管理、更快的匹配查找、更现代的熵编码(如有限状态熵 tANS),以换取更快的解压速度或更高的压缩率。

但截至目前,DEFLATE 依然是最广泛部署的无损压缩引擎——它在 ZIP、PNG、gzip、HTTP 传输、PDF 流式压缩、Git 对象存储里都在用。理解它的"两阶段流水线"思想,你就掌握了现代无损压缩最核心的一条主线。

相关阅读

标签

技术DEFLATE字典编码熵编码LZ77霍夫曼ZIP 压缩PNG 压缩gzip

喜欢这篇?下载闪压试试

完全免费 · 本地处理 · 无广告

立即下载闪压
客服