gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:59:49 27 4
gpt4 key购买 nike

我正在使用 Qt 的 zlib 库解压缩从 http 服务器接收到的 gzip 数据。因为 qUncompress 不好,所以我遵循了这里给出的建议:Qt quncompress gzip data并创建了我自己的方法来解压缩 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;
}

如果解压缩的数据适合输出缓冲区(即小于 16 Kb),一切似乎都可以正常工作。如果不是,则对 inflate 的第二次调用将返回 Z_DATA_ERROR。我确信数据是正确的,因为如果输出缓冲区足够大,相同的数据 block 将被正确解压缩。

服务器不返回具有未压缩数据大小的 header (仅压缩数据的大小)所以我按照 zlib 中的使用说明进行操作:http://www.zlib.net/zlib_how.html

他们做的正是我正在做的。知道我可能会遗漏什么吗?流中的 next_in 和 avail_in 成员似乎在第一次迭代后正确更新。哦,如果它有用的话,发出数据错误时的错误消息是:“无效距离太远”。

有什么想法吗?谢谢。

最佳答案

Deflate/Inflate 压缩/解压缩算法使用 32Kb 循环缓冲区。因此,如果解压缩的数据大于 16Kb,则 16Kb 的缓冲区将永远无法工作。 (不完全正确,因为允许将数据分成 block ,但您需要假设其中可能有 32Kb 的 block 。)因此只需设置 buffer_size = 32768 就可以了。

关于qt - 使用 Qt 解压缩 gzip 数据时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5741657/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com