zlib 在缓冲区扩展时停止
zlib stops on buffer expansion
当我尝试解压缩大小大于 2048 的数据时,zlib 解压缩调用返回Z_OK。因此,为了澄清如果我解压缩大小为 2980 的数据,它将解压缩到 2048(两个循环(,然后返回Z_OK。我错过了什么?
字节是向量<无符号字符>;无符号字符>
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;
}
编辑:
感谢@Michael抓住了 realloc。我一直在搞砸实现并错过了它;在发布之前仍然没有任何借口。
我明白了。
int status
在循环的内部和外部定义。这里的教训永远不是喝酒和发展。
来自 zlib 手册:"在没有足够的空间的情况下,uncompress(( 将用未压缩的数据填充输出缓冲区。
也就是说,最多 1024 字节已经解压缩,然后你会得到Z_BUF_ERROR
和两倍的缓冲区大小,给你 2048 字节的空间,一旦你第二次解压缩,你总共有多达 3072 字节的未压缩数据。
此外,看起来您在realloc
后立即进行不必要的calloc
Z_BUF_ERROR
时。我没有发现您的代码有明显的问题。 您可能错误地预测了未压缩数据的长度。 uncompress()
只有在解压缩了完整的 zlib 流并且未压缩数据的校验值与流末尾的校验值匹配时,才会返回Z_OK
。
相关文章:
- C++字符*缓冲区的大小
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- Xaudio2在更改缓冲区或循环时弹出声音
- 扩展光电二极管探测器以支持多个传感器
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- Winapi:编辑控件不扩展其缓冲区
- zlib 在缓冲区扩展时停止
- 读取协议缓冲区中枚举扩展的值
- OSX上无法识别协议缓冲区扩展
- 从C++访问协议缓冲区扩展重复字段
- 在谷歌协议缓冲区未知扩展
- 访问协议缓冲区扩展字段
- 如何使用协议缓冲区中的扩展来维护'general'消息
- 协议缓冲区 - 如何使用 ProtoBuf 扩展在 C++ 中获取多态性