Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法使用zlib压缩数据流设置字典_C_Dictionary_Compression_Zlib_Deflate - Fatal编程技术网

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

C 无法使用zlib压缩数据流设置字典,c,dictionary,compression,zlib,deflate,C,Dictionary,Compression,Zlib,Deflate,我一直试图通过修改zpipe.c示例在zlib中设置字典。也就是说,我有一个32768个字符的文件,我想把它转换成字典。所以我修改了zpipe() 在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()之后,

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

在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()函数中,我添加了相同的字典(为了完整起见,重复):

调用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

在实现deflateSetDictionary调用时不会显示此错误。我知道这个错误与deflateSetDictionary有关,可能是在使用缓冲区实现时,因为在
inflateSetDictionary()
之后运行带有字典的其他示例(例如)

时没有错误,您需要再次运行
inflate()
。否则,您将脱离内部循环并覆盖已读取的输入马克·阿德勒(Mark Adler)

这是什么意思:“为了更好地衡量,我在调用deflate()之前添加了deflateSetDictionary和每个点”
deflateSetDictionary
应该只调用一次,紧跟在
deflateInit
之后。此行的实例:“int lenDict=(int)sizeof(dict);”这将始终返回32768,和dict[]的内容无关array@MarkAdler,这是我最初的想法,但手册上说:“当使用zlib格式时,必须在deflateInit、deflateInit 2或deflateReset之后,以及在任何deflate调用之前立即调用此函数。”,我认为最后一部分的措辞有些不清楚。我最初也只打了一个电话,紧接着是deflateInit。。。不过,我会再试一次。@user3629249,字典的字节数也是32768,但您是对的,我需要修改,使strlen()位于
inflateSetDictionary()之后。
您需要再次运行
inflate()
。否则,您将脱离内部循环并覆盖已读取的输入。
$ ./zpipe < file.txt > file.gz
$ ./zpipe -d < file.gz > file.dec.txt
zpipe: invalid or incomplete deflate data