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

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

本文关键字:返回 字节 inflate 解压缩 数据 多少 何返回      更新时间:2023-10-16

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

示例:

我有126个字节的压缩数据,想要获得前4个字节的未压缩数据。现在我想获取下一个4字节的未压缩数据,所以

我在哪里设置第一次膨胀后的next_in指针以在压缩数据中开始,这样膨胀后的fext 4字节就是我想要的,就好像我最初将available _out设置为8而不是4一样

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

有什么想法吗?如何将next_in设置为膨胀到我预期的下4个未压缩字节的位置?在这两次呼叫之间,溪流被撕裂了。

更新:

我正试图做这件事,类似于zlib如何定位的声明:

对于zlib流嵌入其他数据的应用程序,需要修改此例程以返回未使用的数据,或者至少指示有多少输入数据未被使用,这样应用程序就知道在zlib流之后在哪里拾取

澄清:

一个更好的问题可能是:

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

第一次充气后的下一个指针在哪里开始压缩的数据,这样在膨胀后,fext 4字节就是我想要,就好像我最初将available _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()文档。)这将不允许您在以后的某个时间从该位位置解压缩,而不必解压缩之前的所有内容。

你想干什么?