2015-05-11 77 views
0

我与zlib的1.2.8源代码http://zlib.net/
在代码工作,最小的匹配值“MIN_MATCH”是“3”(在zutil.h)如何修改zlib MIN_MATCH值?

现在我想修改从该值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()函数下的 '如果MIN_MATCH!= 3' 线)

和我编译,使用坎特伯雷语料库基准文件运行“minigzip”测试程序

压缩工作没有错误,但解压缩不能与'不正确的数据检查'错误r消息

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

感谢

回答

1

MIN_MATCH的3深深内置的代码,所以约重复的更新并不代表一切将需要更改的一个注释。您必须阅读并理解所使用的算法,进行相当数量的更改,然后进行广泛的测试,以确保您做得正确。

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

+0

感谢您的评论。我会尝试的 –