1

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

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

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

4

2 回答 2

2

不,你永远不能假设压缩数据总是更小。事实上,如果任何序列被算法压缩,那么你肯定会扩展一些其他序列。

您可以使用 zlib 的deflate()函数将尽可能多的压缩到 1K 缓冲区中。对结果做任何你需要做的事情,然后继续另一个deflate()调用写入同一个缓冲区。

或者,您可以分配一个足够大的缓冲区以进行最大扩展。deflateBound()or函数会告诉你那compressBound()是多少。只是多了一点点。

于 2013-06-08T02:13:02.050 回答
1

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

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

于 2013-06-07T21:07:59.973 回答