当我尝试解压大于2048的数据时,zlib解压缩调用返回Z_OK。因此,为了澄清如果我解压缩大小为2980的数据,它将解压缩到2048(两个循环),然后返回Z_OK。 我错过了什么?zlib在缓冲区扩展上停止
字节是一个矢量< unsigned char>;
Bytes uncompressIt(const Bytes& data)
{
size_t buffer_length = 1024;
Byte* buffer = nullptr;
int status = 0;
do
{
buffer = (Byte*) calloc(buffer_length + 1, sizeof(Byte));
int status = uncompress(buffer, &buffer_length, &data[ 0 ], data.size());
if (status == Z_OK)
{
break;
}
else if (status == Z_MEM_ERROR)
{
throw runtime_error("GZip decompress ran out of memory.");
}
else if (status == Z_DATA_ERROR)
{
throw runtime_error("GZip decompress input data was corrupted or incomplete.");
}
else //if (status == Z_BUF_ERROR)
{
free(buffer);
buffer_length *= 2;
}
} while (status == Z_BUF_ERROR); //then the output buffer wasn't large enough
Bytes result;
for(size_t index = 0; index != buffer_length; index++)
{
result.push_back(buffer[ index ]);
}
return result;
}
编辑:
感谢@迈克尔用于捕获的realloc。我一直在关注实现并错过了它;发布之前仍然没有任何借口。
实际问题是什么?它不解压大于2048字节或小于? – slugonamission 2012-07-25 20:41:36
如果您将buffer_length加倍并跳回到calloc(),则realloc()是不必要的。如果在错误情况下通过解压缩来更改buffer_length,该怎么办?加倍是正确的事情吗?也许你应该使用不同的值来捕获未压缩数据的长度来保存buffer_length。 – brandx 2012-07-25 20:43:08
@brandx感谢解压缓冲区长度改变的建议,但我已经检查过,而不是这种情况。 – Corvusoft 2012-07-25 20:58:12