在什么情况下压缩数据会大于输入?

时间:2013-06-07 20:52:22

标签: c compression zlib

我需要在我正在处理的实用程序中处理主要是UTF-8 HTML内容的数据压缩。该实用程序使用zLib和deflate算法来压缩数据。如果输入数据大小超过1 kB,压缩数据总是小于未压缩输入,是否安全? (低于1 kB的输入数据不会被压缩。)

我试图看到这种假设会破裂的情况,但除了近乎完美的随机输入外,对我来说似乎是一个安全的假设。

编辑:我对这个假设感到疑惑的原因是因为我已经分配了一个与输入数据一样大的缓冲区。如果我的假设成立,我可以重用相同的缓冲区并避免另外的内存分配。

2 个答案:

答案 0 :(得分:2)

没有。您永远不能假设压缩数据总是更小。实际上,如果算法压缩了任何序列,那么可以保证扩展其他序列。

您可以使用zlib的deflate()函数尽可能多地压缩到1K缓冲区。使用该结果执行您需要的任何操作,然后继续使用另一个deflate()调用写入相同的缓冲区。

或者,您可以为最大扩展分配足够大的缓冲区。 deflateBound()compressBound()函数会告诉您这是多少。它只是一小部分。

答案 1 :(得分:1)

据我所知,zLib不会压缩值为0,1,2,...,127的128字节序列。从技术上讲,有可能故意创建一个破坏压缩方案的HTML页面,但是对于普通的无辜HTML数据,你几乎应该是完全安全的。

但几乎完美并不完美。如果你已经有了这个大小的缓冲区,我建议用这个缓冲区尝试压缩,如果事实证明缓冲区不够(我想zLib有指示的那个),那么分配一个更大的缓冲区或者只需存储未压缩的版本。并确保您将这些案例写入某些日志,以便您可以查看它是否会触发:)