菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
148
0

wss 协议传送过来的数据是经过 gzip 压缩过的,如何使用 qt 解压该数据呢?

原创
05/13 14:22
阅读数 1867
#include <QtZlib/zlib.h>
QByteArray qGzipUncompress(const QByteArray& data)
{
    if (!data.data()) {
        qWarning("qGzipUncompress: Data is null");
        return QByteArray();
    }

    //初始化流结构体
    z_stream unGzipStream;
    unGzipStream.next_in = (z_Bytef*)data.data();//输入字节起始地址
    unGzipStream.avail_in = data.size();//输入字节大小
    unGzipStream.zalloc = Z_NULL;
    unGzipStream.zfree = Z_NULL;
    unGzipStream.opaque = Z_NULL;
    //初始化内部流状态
    int ret = inflateInit2(&unGzipStream,16);
    if(ret != Z_OK)
    {
        qWarning("qGzipUncompress: The call to inflateInit2 returns the wrong value");
        return QByteArray();
    }

    unsigned char buffer[4096];
    QByteArray gzipUnomprData;
    //使用 4MB 的缓冲区循环去接收数据,并把获取到的数据追加给 unComprData,直到获取的数据为空
    do
    {
        unGzipStream.avail_out = 4096;//接收解压数据缓冲区大小
        unGzipStream.next_out = buffer;//接收解压数据缓冲区起始地址
        memset(buffer,0,4096);
        //解压数据
        ret = inflate(&unGzipStream,Z_NO_FLUSH);
        switch(ret)
        {
        case Z_MEM_ERROR:
            qWarning("qGzipUncompress: Z_DATA_ERROR: Not enough memory");
            return QByteArray();
        case Z_NEED_DICT:
            ret = Z_DATA_ERROR;
        case Z_DATA_ERROR:
            qWarning("qGzipUncompress: Z_DATA_ERROR: Input data is corrupted");
            return QByteArray();
        }
        if(ret != Z_FINISH)
        {
            gzipUnomprData.append((char*)buffer);
        }
    }while(unGzipStream.avail_out == 0);
    return gzipUnomprData;
}

根据实际需求 临时接收缓冲区大小

发表评论

0/200
148 点赞
0 评论
收藏