我试图了解使用 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。
通话后:
我的问题:
我也很乐意通过 Flush 参数的变化来讨论上述问题。
谢谢
- 压缩数据以位而非字节存储。我可以确定输入缓冲区中使用的字节中的所有位都已分解吗?我可以确定 next_out 中指向的字节中的所有位都没有被使用吗?
输入字节中所有可以解释和消耗的位都被解释和消耗。最后一个或两个字节中可能还有一些剩余位未被消耗,因为它们只是部分代码,并且需要来自下一个或两个字节的更多位来对其进行解码。
next_out
(和
avail_out
)指的是完整字节。解压的输出是字节。
Deflate 流会自行终止。 inflate 会知道什么时候结束并会在那里停止。如果输入缓冲区包含压缩数据及其后的未压缩数据? zlib 会识别未压缩的数据并在其之前结束还是会产生一些错误?
它会停止。您需要再次开始充气才能解压第二个。如果输入缓冲区包含两个数据块,每个数据块都单独压缩,zlib 会知道它们之间的差异并在第二个数据块之前停止吗?两者都会解压吗?
当它返回时假设输入是分块的,我如何知道我是否完成了数据解压?
end_of_stream
。