zlib中lext数组末尾两个值频繁变更的原因探究
zlib中inftrees.c无效数组条目频繁修改的原因问询
从zlib最早的0.71版本开始,inftrees.c文件中存在如下代码:
local uInt cplext[] = { /* Extra bits for literal codes 257..285 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 128, 128}; /* 128==invalid */
该数组用于确定编解码长度码时需读取的额外比特数(注释标注有误,257-285均为长度码),末尾两个无效条目用于填充数组至32位,而285已是最终有效编码。
在zlib 0.93版本中,这两个无效值从128改为192;zlib 1.05版本又改为112——前两者属于合理的哨兵值,但112看起来相当随意。
zlib 1.2.0版本重写inftrees.c后,数组更名为lext,所有有效条目值较原值+16(应为算法优化需求),但末尾两个无效值仍存在且看似随机:
static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 194};
后续每个zlib版本中,这两个值都会被改为不同的随机数值,甚至在仅更新版本号的提交中也会修改。这些是无效条目,理论上不会影响输出,且库中已有版本字符串标识,无法理解频繁修改的目的,特此问询原因。
内容的提问来源于stack exchange,提问作者D0SBoots
相关产品推荐
相关产品推荐

