zlib在缓冲区扩展时停止

时间:2012-07-25 20:28:32

标签: c++ zlib

当我尝试解压缩大小超过2048的数据时,zlib uncompress调用返回Z_OK。因此,为了澄清我是否解压缩大小为2980的数据,它将解压缩到2048(两个循环)然后返回Z_OK。 我错过了什么?

字节是向量< unsigned char&gt ;;

   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。我一直在捣乱实施并错过了它;发布之前仍然没有任何借口。

3 个答案:

答案 0 :(得分:1)

我明白了。

int status

定义在循环的内部和外部。这里的课程从不喝酒。发展。

答案 1 :(得分:0)

从zlib手册:“如果没有足够的空间,uncompress()将使用未压缩的数据填充输出缓冲区。”

即,最多1024个字节已经解压缩,然后你得到Z_BUF_ERROR并将缓冲区大小加倍,为2048字节提供空间,一旦你第二次解压缩,你就得到了最多3072个字节的未压缩数据。

另外,当你calloc realloc时,看起来你在Z_BUF_ERROR之后不必要{{1}}。

答案 2 :(得分:0)

我发现你的代码没有任何明显的错误。您可能错误地预测了未压缩数据的长度。 uncompress()只有在解压缩完整的zlib流并且未压缩数据的检查值与流末尾的检查值匹配时才会返回Z_OK