c++ - zlib 在缓冲区扩展时停止

标签 c++ zlib

当我尝试解压缩大小大于 2048 的数据时,zlib 解压缩调用返回 Z_OK。所以澄清一下,如果我解压缩大小为 2980 的数据,它将解压缩到 2048(两个循环),然后返回 Z_OK。 我错过了什么?

Bytes是一个 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 获取 realloc。我一直在忙于实现并错过了它;在发布之前仍然没有任何借口。

最佳答案

我明白了。

int status

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

关于c++ - zlib 在缓冲区扩展时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11658082/

相关文章:

用于提取 .zip 文件的 C++ 包装器代码?

c++ - sizeof *这个对象

c++ - 对象的成员函数存储在哪里?

c++ - 在 C++ 和排序中使用原子的乐观锁定策略

c++ - QThread:线程仍在运行时被销毁,QMutex 被销毁

multithreading - Hadoop Zlib 与 JDK Gzip 性能对比

c++程序在打印矩阵时停止而没有错误警告

c - zlib inflateReset 导致内存泄漏(不是)

meteor - ./配置: error: the HTTP gzip module requires the zlib library

c++ - 将 zlib 用于 std::string 和 stringstream