如何返回从inflate()返回解压缩数据实际消耗的字节数?

时间:2015-12-16 22:29:54

标签: c++ zlib

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

示例:

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

在压缩数据中第一次膨胀之后我在哪里设置next_in指针,这样在充气后,fext 4字节就是我想要的,好像我最初将avail_out设置为8而不是4? / strong>

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

任何想法如何设置next_in来膨胀我期望接下来的4个未压缩字节?在这些呼叫之间拆除了流。

更新

我试图这样做,像zlib这样的声明如何到网站:

对于zlib流嵌入其他数据的应用程序,需要修改此例程以返回未使用的数据,或者至少指示未使用多少输入数据,因此应用程序会知道在zlib流之后接收。

澄清:

更好的问题可能是:

是否有可能知道压缩数据中的哪个位置等于我想读取的4个未压缩字节? zstream / zlib中是否有存储/报告此内容的内容?

1 个答案:

答案 0 :(得分:3)

  

在第一次充气开始后,我在哪里设置next_in指针   压缩数据,因此在充气后,fext 4字节是什么   我想,好像我最初将avail_out设置为8而不是4?

您未设置next_in。你只需要留下next_in。它已经指出了在你离开的地方需要指向继续减压的地方。您只需在输入数据用尽时更改next_in,即avail_in为零。

  

在这些来电之间拆分了流。

您无法在流中的某个任意点开始解压缩,而无需先构建上下文,从而达到这一点。通过解压缩之前的所有内容来构建该上下文。您需要当前未压缩数据的滑动窗口以及当前动态代码状态。

如果您可以控制压缩数据的构造,则可以使用Z_FULL_FLUSH在流中插入可以开始解压缩但没有历史记录的点。这将结束最后一个块并启动一个新块,并抛弃滑动窗口。使用它通常会降低压缩效果。

  

对于zlib流嵌入其他数据的应用程序,这个   例程需要修改以返回未使用的数据,或者   至少表明没有使用多少输入数据,所以   应用程序将知道在zlib流之后的哪个位置。

这不是在谈论你认为它在谈论什么。这是指知道放气流结束的位置。它与尝试从中间某处解压缩无关。

  

是否可以知道压缩数据中的哪个位置等于4   我想读的未压缩字节?内有什么东西吗?   存储/报告此内容的zstream / zlib?

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

你想做什么?