微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

zlib 选项 Z_NO_COMPRESSION 导致文件更大

如何解决zlib 选项 Z_NO_COMPRESSION 导致文件更大

我正在尝试使用 zlib 1.2.7 进行纯霍夫曼编码,因此我使用 Z_NO_COMPRESSION 和 Z_HUFFMAN_ONLY 调用 deflateInit2。一切运行正常,我已经验证它可以膨胀回相同的内容

但是,生成字节流(以 c_stream.total_out 衡量)比原始内容

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_END\n");
    exit(1);
}
comprLen = c_stream.total_out;
err = deflateEnd(&c_stream);
CHECK_ERR(err,"deflateEnd");

解决方法

首先,同时要求无压缩和霍夫曼压缩是矛盾的。你要哪个?对于不压缩,请使用 Z_NO_COMPRESSIONZ_DEFAULT_STRATEGY。对于 Huffman-only 压缩,使用 Z_DEFAULT_COMPRESSIONZ_HUFFMAN_ONLY。选择其中之一。

由于您使用的是旧版本的 zlib,相互矛盾的选项应导致 Z_HUFFMAN_ONLY 优先。任何类型的无损压缩都不能保证压缩。尝试使用零字节序列来验证您的操作是否正确,在这种情况下,您将获得大约 8 倍的压缩率。

如果之后您的数据在 Huffman 压缩后扩展,那么您的数据就不能以这种方式压缩。这意味着您的数据中所有 256 字节值的分布大致平坦。

是的,当然,您将获得无压缩的扩展(Z_NO_COMPRESSIONZ_DEFAULT_STRATEGY),大约为 0.01%。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。