我正在使用来自http://zlib.net/的zlib 1.2.8源代码 在代码中,最小匹配值' MIN_MATCH'是' 3' (在zutil.h中)
现在我想将该值从3修改为4,所以我修改了zutil.h
并且deflate.c中有一段代码
/* Initialize the hash value now that we have some input: */
if (s->lookahead + s->insert >= MIN_MATCH) {
uInt str = s->strstart - s->insert;
s->ins_h = s->window[str];
UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
#if MIN_MATCH != 3
Call UPDATE_HASH() MIN_MATCH-3 more times
#endif
while (s->insert) {
UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
#ifndef FASTEST
s->prev[str & s->w_mask] = s->head[s->ins_h];
#endif
s->head[s->ins_h] = (Pos)str;
str++;
s->insert--;
if (s->lookahead + s->insert < MIN_MATCH)
break;
}
}
和
s->strstart += s->match_length;
s->match_length = 0;
s->ins_h = s->window[s->strstart];
UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
#if MIN_MATCH != 3
Call UPDATE_HASH() MIN_MATCH-3 more times
#endif
/* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
* matter since it will be recomputed at next deflate call.
*/
所以我修改了下面的代码
/* Initialize the hash value now that we have some input: */
if (s->lookahead + s->insert >= MIN_MATCH) {
uInt str = s->strstart - s->insert;
s->ins_h = s->window[str];
UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
#if MIN_MATCH != 3
//Call UPDATE_HASH() MIN_MATCH-3 more times
UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
#endif
while (s->insert) {
UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
#ifndef FASTEST
s->prev[str & s->w_mask] = s->head[s->ins_h];
#endif
s->head[s->ins_h] = (Pos)str;
str++;
s->insert--;
if (s->lookahead + s->insert < MIN_MATCH)
break;
}
}
和
s->strstart += s->match_length;
s->match_length = 0;
s->ins_h = s->window[s->strstart];
UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
#if MIN_MATCH != 3
//Call UPDATE_HASH() MIN_MATCH-3 more times
UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
#endif
/* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
* matter since it will be recomputed at next deflate call.
*/
(我把UPDATE_HASH()函数放在&#39;如果MIN_MATCH!= 3&#39;行)
我编译,运行&#39; minigzip&#39;使用坎特伯雷语料库基准文件测试程序
压缩工作没有错误,但解压缩无法使用&#39;不正确的数据检查&#39;错误消息
我应该如何修改代码? 有人有想法吗?
感谢
答案 0 :(得分:1)
MIN_MATCH
of 3深深地构建在代码中,因此关于重复更新的一条评论并不代表所需的所有更改。您必须阅读并理解所使用的算法,进行相当多的更改,然后对其进行广泛测试以确保您做得正确。
如果您要做的只是发出文字而不是3的匹配,那么您可以将if (s->match_length >= MIN_MATCH)
更改为if (s->match_length >= 4)
。