如何zlib压缩QByteArray?

6 c++ qt zlib

我希望在压缩文本时保持地球上其他所有应用程序(包括Web应用程序)之间的互操作性.由于qCompress和qUncompress似乎与谷物相反,我试图直接从我的Qt应用程序中使用zlib.

我将接受最简单(最简单)的答案,它向我展示如何直接使用带有QByteArray的zlib库修改qCompress的输出,以便它可以在Qt应用程序之外使用.

这是我的尴尬尝试:

QByteArray tdata = QString("Oh noes!").toUtf8();
QByteArray cdata;
uLongf len = 12 + 1.002*tdata.length();
compress(&cdata, &len, &tdata, tdata.length());
Run Code Online (Sandbox Code Playgroud)

而错误:

错误:无法将'QByteArray*'转换为'Bytef*'以将参数'1'转换为'int compress(Bytef*,uLongf*,const Bytef*,uLong)'

然后我尝试使用QByteArray :: constData()

compress(cdata.constData(), &len, &tdata, tdata.length());
Run Code Online (Sandbox Code Playgroud)

但得到以下错误:

错误:从'const char*'到'Bytef*'的无效转换

我不知道Bytef是什么,所以我开始查看zlib源代码进行调查.但我能找到的就是QtSources/src/3rdparty/zlib/zconf.h

# define Bytef                 z_Bytef
Run Code Online (Sandbox Code Playgroud)

所以现在我迷失了.

cgm*_*gmb 7

基于qUncompress中的这个注释,我认为这很容易.

注意:如果要使用此函数解压缩使用zlib压缩的外部数据,首先需要在包含数据的字节数组前面添加一个四字节头.标头必须包含未压缩数据的预期长度(以字节为单位),表示为无符号,大端,32位整数.

所以你可以像这样压缩它:

QByteArray tdata = QString("Oh noes!").toUtf8();
QByteArray compressedData = qCompress(tdata);
compressedData.remove(0, 4);
Run Code Online (Sandbox Code Playgroud)