gzip (DEFLATE)
看看 gzip 如何缩小文本:重复内容变成简短的复制,霍夫曼编码让常见符号占用更少的位。
- 窗口:32 KB
- 复制:3-258 字节
- 编码:最长 15 位
- gzip 封装:18 字节
这些是什么意思?
- 字面量:按原样写入的字符,因为从它的位置开始没有 3 个或更多字符的重复。
- 复制:一个长度和一个距离,意思是“从这么远之前取这么多个字符”。它可以与自己生成的文本重叠。
- 窗口:压缩器最远可以回头多远寻找重复。gzip 是 32 KB,Brotli 最大 16 MB。
- 霍夫曼编码:为每个符号分配一串位,常见符号的更短;它由一棵树生成,这棵树反复合并两个最罕见的符号。
- 前缀码:没有哪个编码是另一个编码的开头,因此一串编码无需分隔符就能读回。
LZ77 与霍夫曼编码逐步演示 0 / 19 步
文本有 23 个字符,未压缩时为 184 位。压缩器从左到右读取,在每个位置检查接下来的内容之前是否出现过。
空格键:播放或暂停。左右方向键:单步移动。Home 和 End 键:跳转。
试试看: 把同一个字母输入很多遍。一个距离为 1 的复制就能覆盖全部,因为复制可以与它自己生成的文本重叠。
工作原理
gzip 分两个阶段运行 DEFLATE。LZ77 从头到尾扫描文本,在每个位置查找最近 32 KB 中已经出现过的最长字节序列;它不再重复这些字节,而是写入一个数对:要复制多少字节(3-258),以及它们在多远之前。剩下的内容,即字面量和这些数对,随后用霍夫曼编码写出:常见符号得到短编码,罕见符号得到长编码。gzip 再给结果加上 10 字节的头部和包含 CRC-32 校验和的 8 字节尾部。
适用场合
gzip 适合压缩自身有大量重复的文本:HTML、CSS、JavaScript、JSON、日志、CSV。所有浏览器和服务器都支持它,各个级别都很快,是实时压缩响应的稳妥默认选择。已经压缩过的数据,如 JPEG、PNG、WOFF2 或 ZIP,已经没有重复可找,gzip 只会多加一层封装。
用你自己的文本
同样的两个阶段,由真正的 gzip(级别 6)在更长的文本上完成。粘贴你自己的文本,或从 Gzip 与 Brotli 压缩工具带一段过来。
输入