当我们使用字典时,我正在尝试理解原始deflate的功能。我知道以下内容。
1.当我们使用字典时,应用程序应该为deflate()和inflate()提供相同的字典。
2.执行原始deflate时,必须在任何deflate调用之前调用此函数,或者在完成deflate块之后立即调用此函数,即在使用所有输入并且在使用任何刷新选项时已传递所有输出之后{ {1}},Z_BLOCK
,Z_PARTIAL_FLUSH
或Z_SYNC_FLUSH
。 (来自zlib文档)。
但是以下应用程序无法解压缩先前使用相同应用程序压缩的内容。压缩和解压缩是成功的,但输入和未压缩文件之间存在不匹配。
放气:
Z_FULL_FLUSH
充气:
do {
ret = deflateSetDictionary(&strm, dictionary, sizeof(dictionary));
if(ret != Z_OK) {
fprintf(stderr, "Failed to set deflate dictionary\n");
return Z_STREAM_ERROR;
}
strm.avail_in = fread(in, 1, CHUNK, source);
if (ferror(source)) {
(void)deflateEnd(&strm);
return Z_ERRNO;
}
flush = feof(source) ? Z_FINISH : Z_FULL_FLUSH;
strm.next_in = in;
/* run deflate() on input until output buffer not full, finish
compression if all of source has been read in */
do {
strm.avail_out = CHUNK;
strm.next_out = out;
ret = deflate(&strm, flush); /* no bad return value */
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
have = CHUNK - strm.avail_out;
if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
(void)deflateEnd(&strm);
return Z_ERRNO;
}
} while (strm.avail_out == 0);
assert(strm.avail_in == 0); /* all input will be used */
/* done when last data in file processed */
} while (flush != Z_FINISH);
assert(ret == Z_STREAM_END);
答案 0 :(得分:1)
放气时,每隔CHUNK
个输入字节设置相同的字典。为什么?您应该在deflateSetDictionary()
之后立即使用deflateInit2()
。从那时起,输入数据本身应该作为匹配字符串的更好来源,而不是您可能提供的字典。
在膨胀方面,您必须知道压缩块的结束位置,以便您可以在压缩时与{1}}完全相同的位置进行操作。这需要某种标记,计数或搜索完全冲洗模式。