使用Qt解压缩gzip数据时出错
我正在使用Qt中的zlib库解压缩从http服务器接收的gzip数据。因为qUncompress不好,所以我遵循这里给出的建议:创建了自己的方法来解压缩gzip数据,如下所示:使用Qt解压缩gzip数据时出错,qt,compression,gzip,Qt,Compression,Gzip,我正在使用Qt中的zlib库解压缩从http服务器接收的gzip数据。因为qUncompress不好,所以我遵循这里给出的建议:创建了自己的方法来解压缩gzip数据,如下所示: QByteArray gzipDecompress( QByteArray compressData ) { //strip header compressData.remove(0, 10); const int buffer_size = 16384; quint8 buffer
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;
}
QByteArray gzip解压(QByteArray压缩数据)
{
//带钢割台
压缩数据。删除(0,10);
const int buffer_size=16384;
quint8缓冲区[缓冲区大小];
z_流cmpr_流;
cmpr_stream.next_in=(unsigned char*)compressData.data();
cmpr_stream.avail_in=compressData.size();
cmpr_stream.total_in=0;
cmpr_stream.next_out=缓冲区;
cmpr_stream.avail_out=缓冲区大小;
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);
如果(状态!=Z_正常){
qDebug()放气/充气压缩/解压算法使用32Kb的循环缓冲区。因此,如果解压的数据大于16Kb,16Kb的缓冲区将永远无法工作。(严格来说,这不是真的,因为允许将数据拆分为块,但您需要假设其中可能有32Kb的块。)所以只要设置buffer\u size=32768
就可以了。我也遇到了同样的问题,我使用以下方法解决了这个问题