无法压缩使用zlib设置字典的数据流

时间:2014-12-29 21:52:41

标签: c dictionary compression zlib deflate

我一直在尝试通过修改zpipe.c示例在zlib中设置字典。也就是说,我有一个32768个字符的文件,我想把它变成字典。所以我修改了zpipe(http://www.zlib.net/zpipe.c)。

在def()函数中,我添加了:

char dict[32768];
FILE *fd = fopen("dictB.txt", "r");
ssize_t test = fread(dict, 32768, 1, fd);
int lenDict = (int) sizeof(dict);
fclose(fd);

在deflateInit()之后,我添加了以下内容

ret = deflateSetDictionary(&strm, (const Bytef*) dict, lenDict);

为了更好的衡量,我在调用deflate()

之前添加了deflateSetDictionary和每个点

在inf()函数中,我添加了相同的字典(重复完整性):

char dict[32768];
FILE *fd = fopen("dictB.txt", "r");
ssize_t test = fread(dict, 32768, 1, fd);
int lenDict = (int) sizeof(dict);
fclose(fd);

在inflate()调用之后,我修改了zpipe.c,以便它可以接受字典调用:

ret = inflate(&strm, Z_NO_FLUSH);
if (ret==Z_NEED_DICT){
   ret = inflateSetDictionary(&strm, (const Bytef*) dict, lenDict); 
}
assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
switch (ret) {
 case Z_DATA_ERROR:
 case Z_MEM_ERROR:
    (void)inflateEnd(&strm);
    return ret;
}

现在,在运行压缩之后

$ ./zpipe < file.txt > file.gz

然后一切都运行没有错误

但是当我尝试解压缩时

$ ./zpipe -d < file.gz > file.dec.txt

然后我获得了与Z_DATA_ERROR

相关的错误
zpipe: invalid or incomplete deflate data

实现deflateSetDictionary调用时,不会显示此错误。我知道这个错误与deflateSetDictionary有关,也许在使用缓冲区实现时,因为在运行带有字典的其他示例(例如http://www.chuntey.com/Source/Zlib/example.c)时没有错误

1 个答案:

答案 0 :(得分:0)

inflateSetDictionary()之后您需要再次运行inflate()。否则,您将退出内循环并覆盖已读取的输入。 - 马克阿德勒