c - Zlib 最小放气大小

标签 c zlib

我正在尝试找出是否有一种方法可以根据输入缓冲区的大小计算输出缓冲区的最小 所需大小。

这个问题类似于zlib, deflate: How much memory to allocate? ,但不一样。我询问的是孤立的每个 block ,而不是整个流。

假设我们有两个缓冲区:INPUTOUTPUT,并且我们有一个 BUFFER_SIZE,即 4096 字节。 (只是一个方便的数字,我选择这个尺寸没有特别的原因。)

如果我放气使用:

deflate(stream, Z_PARTIAL_FLUSH)

这样每个 block 都被压缩,并立即刷新到输出缓冲区,有没有一种方法可以保证输出缓冲区中有足够的存储空间而无需重新分配?

从表面上看,我们假设 DEFLATED 数据总是大于未压缩的输入数据(假设我们使用大于 0 的压缩级别。)

当然,情况并非总是如此 - 特别是对于小值。例如,如果我们压缩单个字节,压缩后的数据显然会比未压缩的数据大,这是由于 LZW 流中的 header 和字典等内容的开销。

考虑 LZW 的工作原理,如果我们的输入数据至少为 256 字节(意味着最坏的情况,每个字节都不同,我们不能真正压缩任何东西),我们应该意识到输入大小更小超过 256 字节 + zlib header 可能需要更大的输出缓冲区。

但是,一般来说,现实世界的应用程序不会像那样压缩小尺寸。因此,假设输入/输出缓冲区更像是 4K,是否有某种方法可以保证输出压缩数据比输入数据小?

(此外,我知道 deflateBound,但由于开销,我宁愿避免使用它。)

或者,换句话说,是否有一些最小缓冲区大小可用于输入/输出缓冲区,以保证输出数据(压缩流)小于输入数据?还是总有一些病态情况会导致输出流大于输入流,无论大小如何?

最佳答案

虽然我不能完全理解你的问题,但我可以单独评论部分问题。

is there some way to GUARANTEE that the output compressed data will be SMALLER than the input data?

绝对不是。压缩输出总是有可能大于某些输入。否则您将无法压缩其他输入。

(Also, I know about deflateBound, but would rather avoid it because of the overhead.)

几乎没有开销。我们说的是比合理大小的输入缓冲区大百分之几。

顺便说一句,deflateBound() 提供了整个输出流大小的界限,作为整个输入流大小的函数。当您处于输入不完整且输出空间不足的一堆 deflate() 调用中间时,它无法为您提供帮助。例如,您可能仍然有 deflate 输出挂起并由下一个 deflate() 调用交付,根本没有提供任何新输入。那么对于那个孤立的调用,扩展比率是无限的。

due to the overhead of things like headers and dictionaries in the LZW stream.

deflate 不是 LZW。它使用的方法称为 LZ77。它与现在已经过时的 LZW 有很大不同。压缩的放气数据中没有存储“字典”。 “字典”只是当前正在压缩或解压缩的数据之前的未压缩数据。

Or, to put it another way, is there some minimum buffer size that I can use for input/output buffers ...

zlib 接口(interface)背后的整个想法是让您不必担心缓冲区中适合什么。您只需不断调用 deflate()inflate() 并提供更多输入数据和更多输出空间,直到完成,一切都会好起来的。您是否需要进行多次调用来消耗一个输入缓冲区,或者需要进行多次调用来填充一个输出缓冲区,这都无关紧要。您只需使用循环来进行更多调用,在需要时提供更多输入,并在需要时处理输出并提供新的输出空间。

关于c - Zlib 最小放气大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923704/

相关文章:

c - 有没有什么设计工具可以让我获得C代码中不同函数的确切指令数

c - 如何使用较新版本升级/更新 C 应用程序

c++ - 使用自定义编译的 zlib 在 Linux 上编译 Boost.Iostream 会导致多个卡纸错误

Ruby zlib deflate 海量数据

python - 导入 zlib ImportError : No module named zlib

c - 不清楚 stdin 输入问题

c - 类型匹配错误 - 为什么?

c - 是否有与 Perl 的 Carp 模块等效的 C 语言?

c++ - 如何绕过在 Windows 上使用 zip (gz) 支持单独构建 Boost.Iostream?

delphi - 如何吃掉从流中流出的字节?