当我尝试解压缩大小大于2048的数据时,zlib的uncompress调用返回Z_OK。因此,要弄清楚是否要解压缩大小为2980的数据,它将最多解压缩2048(两个循环),然后返回Z_OK。
我想念什么?

字节是一个 vector ;

   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捕获重新分配。我一直在摸索实施,却错过了;发布前仍然没有任何借口。

最佳答案

我知道了。

int status

在循环的内部和外部定义。这里的教训永远不会喝酒和发展。

10-08 12:20