如何返回实际消耗了多少字节来从inflate()返回解压缩的数据
How to return how many bytes were actually consumed to return the decompressed data from inflate()?
我正在使用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_in
和data_type
。(请阅读zlib.h中的inflate()
文档。)这将不允许您在以后的某个时间从该位位置解压缩,而不必解压缩之前的所有内容。
你想干什么?
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- C++/CX 如何从 IRandomAccessStream^ 转换为字节并返回.(UWP)
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- C++ 从函数返回无符号字节
- 裸__declspec上的 memcpy 返回意外的字节
- InternetReadFile 填充缓冲区,但返回零字节读取
- 如果send()返回x字节,则recv()在一个呼叫中获取相同数量的字节
- ::运算符 delete(指针) 返回释放的字节大小
- 函数返回的 gsl::span 具有错误的字节
- 如何迫使新操作员返回的指针将是32字节对齐
- 返回字节数组或将数组传递到函数中
- crypto++将密钥保存到字节队列并返回到密钥
- mbtowc在osx上总是返回一个字节
- C 我应该如何返回字节数组
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 如果在 main 中使用字符串,为什么 CRT 会返回 8 字节泄漏
- TCP Recv使用select()返回1字节读取
- 如何在Crypto++中返回字节值
- Microsoft psapi方法是否使用十进制或二进制表示法返回字节?
- 函数接受两个参数,一个字节和一个位字段,并返回字节中字段的值