zlib选项Z_NO_COMPRESSION会导致文件变大



我正试图将zlib 1.2.7用于纯霍夫曼编码,因此我使用Z_NO_COMPRESSION和Z_Huffman_ONLY调用deflateInit2。一切都很好,我已经验证了它可以膨胀回相同的内容。

然而,得到的字节流(如在c_stream.total_out中测量的(比原始内容大(<5%(。即使我传入Z_DEFAULT_STRATEGY而不是Z_HUFFMAN_ONLY,也会发生这种情况。有人能告诉我我的想法或代码哪里出了问题吗?

z_stream c_stream;
c_stream.zalloc = (alloc_func)0;
c_stream.zfree = (free_func)0;
c_stream.opaque = (voidpf)0;
err = deflateInit2(&c_stream, Z_NO_COMPRESSION, Z_DEFLATED, 15, 8, Z_HUFFMAN_ONLY);
CHECK_ERR(err, "deflateInit2");
comprLen  = deflateBound(&c_stream, uncomprLen);
Byte *compr = (Byte *)calloc(comprLen * sizeof(Byte), 1); 
c_stream.next_out = compr;
c_stream.avail_out = (uInt)comprLen;
c_stream.next_in = uncompr;
c_stream.avail_in = (uInt)uncomprLen;
err = deflate(&c_stream, Z_FINISH);
if (err != Z_STREAM_END) {
fprintf(stderr, "deflate should report Z_STREAM_ENDn");
exit(1);
}
comprLen = c_stream.total_out;
err = deflateEnd(&c_stream);
CHECK_ERR(err, "deflateEnd");

首先,要求不进行压缩和同时进行霍夫曼压缩是矛盾的。你想要哪个?对于无压缩,请使用Z_NO_COMPRESSIONZ_DEFAULT_STRATEGY。对于仅Huffman压缩,请使用Z_DEFAULT_COMPRESSIONZ_HUFFMAN_ONLY。选一个。

由于您使用的是较旧版本的zlib,因此相互矛盾的选项应该会导致Z_HUFFMAN_ONLY优先。任何类型的无损压缩都不能保证压缩。尝试一个零字节的序列来验证你做得是否正确,在这种情况下,你会得到大约八倍的压缩。

如果在那之后你的数据在霍夫曼压缩后扩展,那么很简单,你的数据是不可压缩的。这意味着您的数据中所有256字节值的分布大致平坦。

是的,当然你会得到没有压缩的扩展(Z_NO_COMPRESSIONZ_DEFAULT_STRATEGY(,大约为0.01%

相关内容

  • 没有找到相关文章

最新更新