【发布时间】:2015-03-16 21:34:55
【问题描述】:
我正在处理的应用程序的一部分涉及通过套接字逐个接收 zlib(deflate)格式的压缩数据流。该例程基本上是接收块中的压缩数据,并在更多数据可用时将其传递给inflate。当inflate 返回Z_STREAM_END 时,我们知道完整的对象已经到达。
一个非常简化的C++基础inflater函数如下:
void inflater::inflate_next_chunk(void* chunk, std::size_t size)
{
m_strm.avail_in = size;
m_strm.next_in = chunk;
m_strm.next_out = m_buffer;
int ret = inflate(&m_strm, Z_NO_FLUSH);
/* ... check errors, etc. ... */
}
除了奇怪的是,每次点赞... 40 次左右,inflate 都会以Z_DATA_ERROR 失败。
根据zlib manual,Z_DATA_ERROR 表示“损坏或不完整”流。显然,我的应用程序中的数据可能会以多种方式被破坏,这超出了这个问题的范围 - 但经过一番修补后,我意识到如果 @987654331 调用 inflate 将返回 Z_DATA_ERROR @ 在我将其设置为 size 之前,不是 0。换句话说,inflate 似乎失败了,因为在我设置avail_in 之前流中已经有数据。
但我的理解是每次调用inflate 都应该完全清空输入流,这意味着当我再次调用inflate 时,如果最后一次调用没有结束,我不必担心。我的理解在这里正确吗?还是我总是需要检查strm.avail_in 以查看是否有待处理的输入?
另外,为什么会有待处理的输入?为什么inflate 不简单地在每次调用时消耗所有可用的输入?
【问题讨论】: