如何 return 从 inflate() 解压后的数据 return 实际消耗了多少字节?

How to return how many bytes were actually consumed to return the decompressed data from inflate()?

我正在使用 zlib 来膨胀一些压缩数据。调用者通过 zstream avail_out 指定它想要多少未压缩字节。我需要得到的是从 next_in 缓冲区消耗了多少实际字节来增加请求的 avail_out 字节数。 total_in 数量是膨胀了多少,但它比填充 next_out 缓冲区的实际 "needed" 大。

示例:

我有126字节的压缩数据,想得到未压缩数据的前4字节。现在我想提取并获取接下来的 4 个字节的未压缩数据,所以

我在哪里设置第一次膨胀后的 next_in 指针以在压缩数据中开始,以便在 inflation 之后的 fext 4 字节是我想要的,因为如果我最初将 avail_out 设置为 8 而不是 4?

我已经尝试 Z_BLOCK 从最后一个字节中获取未使用的位,但它们没有对齐我期望 next_in 读取开始的位置。

关于如何设置 next_in 以在我期望接下来的 4 个未压缩字节所在的位置膨胀的任何想法?流在这些调用之间被拆除。

更新:

我正在尝试执行此操作,例如 zlib 如何站点中的声明:

对于 zlib 流嵌入其他数据的应用程序,此例程需要修改为 return 未使用的数据,或者至少指示有多少输入数据未被使用使用,因此应用程序将知道在 zlib 流之后从哪里获取。

澄清:

更好的问题可能是:

是否可以知道压缩数据中的哪个位置等于我想读取的 4 个未压缩字节? zstream/zlib 里面有什么东西 stores/reports 这个吗?

Where do I set the next_in pointer after the first inflate to start in the compressed data, so that after inflation the fext 4 bytes are what I want, as if I originally set avail_out as 8 and not 4?

您没有设置 next_in。你就让 next_in 一个人呆着吧。它已经指向需要指向的位置,以便从您中断的地方继续减压。当您 运行 没有输入数据时,您只需要潜在地更改 next_in,即 avail_in 为零。

The stream is torn down between these calls.

如果没有先建立上下文,您就无法在流中的任意点开始解压缩,这将使您到达该点。该上下文是通过解压缩它之前的所有内容来建立的。您需要未压缩数据的当前滑动 window 以及当前动态代码状态。

如果您控制压缩数据的构建,您可以使用 Z_FULL_FLUSH 在流中插入点,在这些点上您可以开始解压,没有历史记录。这结束了最后一个块并开始了一个新块,并丢弃了滑动 window。使用它通常会降低压缩率。

For applications where zlib streams are embedded in other data, this routine would need to be modified to return the unused data, or at least indicate how much of the input data was not used, so the application would know where to pick up after the zlib stream.

这不是在谈论你认为它在谈论什么。那是指知道放气流的末端在哪里。这与尝试从中间某处解压无关。

Is it possible to know where in the compressed data equates to the 4 uncompressed bytes I wanted read? Is there something within zstream/zlib that stores/reports this?

在解压缩时,您可以确定在任何 inflate() 调用后 returns 已经消耗了多少字节和位来生成到目前为止返回的数据。你只需要看看 avail_indata_type。 (阅读 zlib.h 中的 inflate() 文档。)这将不允许您在稍后从该位位置解压缩,而无需解压缩之前的所有内容。

你想做什么?