如何正确使用 zlib::inflate_stream::write?

问题描述 投票:0回答:1

我试图了解使用 zlib::inflate_stream::write 的小细节。 代码或多或少是这样的:

zlib::z_params params;
zlib::inflate_stream inflate;

params.data_type = zlib::binary;
params.avail_in =  inBufferSize;
params.next_in  =  inBuffer;
params.avail_out = outBufferSize;
params.next_out =  outBuffer;

boost::beast::error_code boostErrorCode;
inflate.write(zParams, zlib::Flush::finish, boostErrorCode);

这不是我的代码,所以我不想更改 zlib::Flush::finish,尽管很多时候输入是批量的。

这是我的理解:
通话前:
参数如预期:avail_in 是输入缓冲区中的字节数,即 next_in。 avail_out是输出缓冲区的大小-avail_out。
通话后:

  • avail_in 是输入缓冲区中剩余未使用的字节数。
  • next_in - 使用了在此之前的所有字节。该字节和以下字节未使用。
  • avail_out 是写入输出缓冲区的数据量
  • next_out - 已写入的数据已写入到此点,不包括。

我的问题:

  • 压缩数据以位而非字节存储。我可以确定输入缓冲区中使用的字节中的所有位都已分解吗?我可以确定 next_out 中指向的字节中的所有位都没有被使用吗?
  • 如果输入缓冲区包含压缩数据及其后的未压缩数据? zlib 会识别未压缩的数据并在其之前结束还是会产生一些错误?
  • 如果输入缓冲区包含两个数据块,每个数据块都单独压缩,zlib 会知道它们之间的差异并在第二个数据块之前停止吗?两者都会解压吗?
  • 假设输入是分块的,我如何知道我是否完成了数据解压?

我也很乐意通过 Flush 参数的变化来讨论上述问题。

谢谢

c++ compression zlib
1个回答
0
投票
  • 压缩数据以位而非字节存储。我可以确定输入缓冲区中使用的字节中的所有位都已分解吗?我可以确定 next_out 中指向的字节中的所有位都没有被使用吗?

输入字节中所有可以解释和消耗的位都被解释和消耗。最后一个或两个字节中可能还有一些剩余位未被消耗,因为它们只是部分代码,并且需要来自下一个或两个字节的更多位来对其进行解码。

next_out

(和
avail_out
)指的是完整字节。解压的输出是字节。

    如果输入缓冲区包含压缩数据及其后的未压缩数据? zlib 会识别未压缩的数据并在其之前结束还是会产生一些错误?
Deflate 流会自行终止。 inflate 会知道什么时候结束并会在那里停止。

    如果输入缓冲区包含两个数据块,每个数据块都单独压缩,zlib 会知道它们之间的差异并在第二个数据块之前停止吗?两者都会解压吗?
它会停止。您需要再次开始充气才能解压第二个。

    假设输入是分块的,我如何知道我是否完成了数据解压?
当它返回时

end_of_stream

© www.soinside.com 2019 - 2024. All rights reserved.