Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Qt解压缩gzip数据时出错_Qt_Compression_Gzip - Fatal编程技术网

使用Qt解压缩gzip数据时出错

使用Qt解压缩gzip数据时出错,qt,compression,gzip,Qt,Compression,Gzip,我正在使用Qt中的zlib库解压缩从http服务器接收的gzip数据。因为qUncompress不好,所以我遵循这里给出的建议:创建了自己的方法来解压缩gzip数据,如下所示: QByteArray gzipDecompress( QByteArray compressData ) { //strip header compressData.remove(0, 10); const int buffer_size = 16384; quint8 buffer

我正在使用Qt中的zlib库解压缩从http服务器接收的gzip数据。因为qUncompress不好,所以我遵循这里给出的建议:创建了自己的方法来解压缩gzip数据,如下所示:

 QByteArray gzipDecompress( QByteArray compressData )
 {
    //strip header
    compressData.remove(0, 10);

    const int buffer_size = 16384;
    quint8 buffer[buffer_size];

    z_stream cmpr_stream;
    cmpr_stream.next_in = (unsigned char *)compressData.data();
    cmpr_stream.avail_in = compressData.size();
    cmpr_stream.total_in = 0;

    cmpr_stream.next_out = buffer;
    cmpr_stream.avail_out = buffer_size;
    cmpr_stream.total_out = 0;

    cmpr_stream.zalloc = Z_NULL;
    cmpr_stream.zfree = Z_NULL;
    cmpr_stream.opaque = Z_NULL;

    int status = inflateInit2( &cmpr_stream, -8 );
    if (status != Z_OK) {
        qDebug() << "cmpr_stream error!";
    }

    QByteArray uncompressed;
    do {
        cmpr_stream.next_out = buffer;
        cmpr_stream.avail_out = buffer_size;

        status = inflate( &cmpr_stream, Z_NO_FLUSH );

        if (status == Z_OK || status == Z_STREAM_END)
        {
            QByteArray chunk = QByteArray::fromRawData((char *)buffer, buffer_size - cmpr_stream.avail_out);
            uncompressed.append( chunk );
        }
        else
        {
            inflateEnd(&cmpr_stream);
            break;
        }

        if (status == Z_STREAM_END)
        {
            inflateEnd(&cmpr_stream);
            break;
        }
    }
    while (cmpr_stream.avail_out == 0);

    return uncompressed;
 }
QByteArray gzip解压(QByteArray压缩数据)
{
//带钢割台
压缩数据。删除(0,10);
const int buffer_size=16384;
quint8缓冲区[缓冲区大小];
z_流cmpr_流;
cmpr_stream.next_in=(unsigned char*)compressData.data();
cmpr_stream.avail_in=compressData.size();
cmpr_stream.total_in=0;
cmpr_stream.next_out=缓冲区;
cmpr_stream.avail_out=缓冲区大小;
cmpr_stream.total_out=0;
cmpr_stream.zalloc=Z_NULL;
cmpr_stream.zfree=Z_NULL;
cmpr_stream.opaque=Z_NULL;
int status=inflateInit2(&cmpr_-stream,-8);
如果(状态!=Z_正常){

qDebug()放气/充气压缩/解压算法使用32Kb的循环缓冲区。因此,如果解压的数据大于16Kb,16Kb的缓冲区将永远无法工作。(严格来说,这不是真的,因为允许将数据拆分为块,但您需要假设其中可能有32Kb的块。)所以只要设置
buffer\u size=32768
就可以了。

我也遇到了同样的问题,我使用以下方法解决了这个问题