字面字节与向后引用
压缩表示可以直接输出字面字节,也可以给出一个长度与向后距离,要求解码端从已生成内容复制。RFC1951规定匹配长度为3至258,向后距离为1至32768字节;具体压缩器可以选择更保守的搜索范围。
被引用片段允许与当前输出重叠。例如已有XY,长度5、距离2的引用会继续生成XYXYX,而不是要求五个源字节事先全部存在。引用也可以越过块边界,所以新块不必然意味着可独立解码或历史窗口清空。
参考:[1]
块头说明如何解释编码
每个块头标明是否为最后一块,并区分未压缩、固定Huffman或动态Huffman三类。动态块先传递码长表示,让解码端重建字面值与长度、距离的编码;固定块则使用规范预定的码,不必每块重新发送树。
长度还可能带附加位,Huffman编码块用专门符号256表示块结束;未压缩块则按LEN给出的字节数量结束,并用NLEN核对长度。压缩器选择怎样分块、寻找哪些匹配,可以影响速度和输出大小;只要输出遵守格式,解码端不需要知道压缩器用了哪一种搜索策略。格式规范与某一套最优压缩算法不是同一个东西。
参考:[1]
压缩流、容器与资源边界
gzip与zlib都可包围DEFLATE内容,却具有不同头部、尾部和校验约定。把原始DEFLATE或zlib输出直接交给只接受gzip的接口,不能因内部压缩方法相同就认为文件必然兼容;API需要明确期望哪层表示。
向后距离有界,使解码不必永久保存全部历史,但不代表解压后的总输出大小有界,也不自动提供随机访问。处理不可信压缩数据时仍需单独约束输出与资源;完整压缩比也要计入块头、编码表及外层信息。