提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
之前使用QT进行TCP传输数据,如果碰到大文件的传输会导致传输数据巨大。由于通信格式使用json,其不支持二进制数据的传输,所以要将二进制数据转换为base64进行传输,这样数据量会增加30%左右,因此现在将json格式后的数据使用Gzip进行压缩,节省大量流量
一、编译zlib库
1.下载zlib
下载地址:Zlib官网
2.编译
将win32\makefile.gcc拷贝到zlib源码的根目录
使用QtCreator集成安装的mingw编译zlib
命令: mingw32-make -f makefile.gcc
文件夹会出现libz.a
二、QT导入
1.引入库
通过QtCreator 右键项目==>添加库==>外部库 选择libz.a 后,项目的proto文件会自动加入一下项目
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/zlib/ -lz
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/zlib/ -lzd
else:unix: LIBS += -L$$PWD/zlib/ -lz
2.导入zlib头文件
#include “zlib.h”
#include “zconf.h”
3.QT使用zlib进行Gzip解压缩代码
QByteArray GzipCompress(QByteArray postBody)
{
QByteArray outBuf;
z_stream c_stream;
int err = 0;
int windowBits = 15;
int GZIP_ENCODING = 16;
if (!postBody.isEmpty())
{
c_stream.zalloc = (alloc_func)0;
c_stream.zfree = (free_func)0;
c_stream.opaque = (voidpf)0;
c_stream.next_in = (Bytef *)postBody.data();
c_stream.avail_in = postBody.size();
if (deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
MAX_WBITS + GZIP_ENCODING, 8, Z_DEFAULT_STRATEGY) != Z_OK) return QByteArray();
for (;;) {
char destBuf[4096] = { 0 };
c_stream.next_out = (Bytef *)destBuf;
c_stream.avail_out = 4096;
int err = deflate(&c_stream, Z_FINISH);
outBuf.append(destBuf, 4096 - c_stream.avail_out);
if (err == Z_STREAM_END || err != Z_OK)
{
break;
}
}
auto total = c_stream.total_out;
deflateEnd(&c_stream);
total = c_stream.total_out;
}
return outBuf;
}
QByteArray GZipUnCompress(QByteArray src)
{
QByteArray outBuffer;
z_stream strm;
strm.zalloc = NULL;
strm.zfree = NULL;
strm.opaque = NULL;
strm.avail_in = src.size();
strm.next_in = (Bytef *)src.data();
int err = -1, ret = -1;
err = inflateInit2(&strm, MAX_WBITS + 16);
if (err == Z_OK) {
while (true)
{
char buffer[4096] = { 0 };
strm.avail_out = 4096;
strm.next_out = (Bytef *)buffer;
int code = inflate(&strm, Z_FINISH);
outBuffer.append(buffer, 4096 - strm.avail_out);
// qDebug()<<"ddd"<<code<<Z_OK;
if (Z_STREAM_END == code )
{
break;
}
}
}
inflateEnd(&strm);
return outBuffer;
}
总结
项目链接:链接