我正试图将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_COMPRESSION
和Z_DEFAULT_STRATEGY
。对于仅Huffman压缩,请使用Z_DEFAULT_COMPRESSION
和Z_HUFFMAN_ONLY
。选一个。
由于您使用的是较旧版本的zlib,因此相互矛盾的选项应该会导致Z_HUFFMAN_ONLY
优先。任何类型的无损压缩都不能保证压缩。尝试一个零字节的序列来验证你做得是否正确,在这种情况下,你会得到大约八倍的压缩。
如果在那之后你的数据在霍夫曼压缩后扩展,那么很简单,你的数据是不可压缩的。这意味着您的数据中所有256字节值的分布大致平坦。
是的,当然你会得到没有压缩的扩展(Z_NO_COMPRESSION
和Z_DEFAULT_STRATEGY
(,大约为0.01%