Qt quncompress gzip data

前端 未结 3 2044
遥遥无期
遥遥无期 2020-12-10 04:51

I stumble upon a problem, and can\'t find a solution.

So what I want to do is uncompress data in qt, using qUncompress(QByteArray), send from www in gzip format. I

3条回答
  •  长情又很酷
    2020-12-10 05:11

    Directly using zlib is not that hard.

    I've been doing it like this:

    QByteArray gUncompress(const QByteArray &data)
    {
        if (data.size() <= 4) {
            qWarning("gUncompress: Input data is truncated");
            return QByteArray();
        }
    
        QByteArray result;
    
        int ret;
        z_stream strm;
        static const int CHUNK_SIZE = 1024;
        char out[CHUNK_SIZE];
    
        /* allocate inflate state */
        strm.zalloc = Z_NULL;
        strm.zfree = Z_NULL;
        strm.opaque = Z_NULL;
        strm.avail_in = data.size();
        strm.next_in = (Bytef*)(data.data());
    
        ret = inflateInit2(&strm, 15 +  32); // gzip decoding
        if (ret != Z_OK)
            return QByteArray();
    
        // run inflate()
        do {
            strm.avail_out = CHUNK_SIZE;
            strm.next_out = (Bytef*)(out);
    
            ret = inflate(&strm, Z_NO_FLUSH);
            Q_ASSERT(ret != Z_STREAM_ERROR);  // state not clobbered
    
            switch (ret) {
            case Z_NEED_DICT:
                ret = Z_DATA_ERROR;     // and fall through
            case Z_DATA_ERROR:
            case Z_MEM_ERROR:
                (void)inflateEnd(&strm);
                return QByteArray();
            }
    
            result.append(out, CHUNK_SIZE - strm.avail_out);
        } while (strm.avail_out == 0);
    
        // clean up and return
        inflateEnd(&strm);
        return result;
    }
    

    The code is monstly copied from the zlib code example page. You will need to include

提交回复
热议问题