如何修改zlib MIN_MATCH值?

时间:2015-05-11 13:19:45

标签: c compression zlib

我正在使用来自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;错误消息

我应该如何修改代码? 有人有想法吗?

感谢

1 个答案:

答案 0 :(得分:1)

MIN_MATCH of 3深深地构建在代码中,因此关于重复更新的一条评论并不代表所需的所有更改。您必须阅读并理解所使用的算法,进行相当多的更改,然后对其进行广泛测试以确保您做得正确。

如果您要做的只是发出文字而不是3的匹配,那么您可以将if (s->match_length >= MIN_MATCH)更改为if (s->match_length >= 4)