2 zuofabutong zuofabutong 于 2014.05.12 19:00 提问

使用zlib库解压http数据时遇到的问题

最近在用c++写一个爬虫程序,遇到一个问题,不能解压服务器返回的压缩数据,解压数据的函数是在网上看的,如下:

bool GzipDecompress(Byte *source, uLong source_length, Byte *dest, uLong *dest_length)
{
    int err = 0;
    z_stream d_stream = {0}; 
    static char dummy_head[2] =
    {
    0x8 + 0x7 * 0x10,
    (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
    };
    d_stream.zalloc = (alloc_func)0;
    d_stream.zfree = (free_func)0;
    d_stream.opaque = (voidpf)0;
    d_stream.next_in = source;
    d_stream.avail_in = 0;
    d_stream.next_out = dest;
    if(inflateInit2(&d_stream, 47) != Z_OK) 
        return false;
    while (d_stream.total_out < *dest_length && d_stream.total_in < source_length) {
        d_stream.avail_in = d_stream.avail_out = 1; 
        if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) 
            break;
        if(err != Z_OK )
        {
            if(err == Z_DATA_ERROR)
            {
                d_stream.next_in = (Bytef*) dummy_head;
                d_stream.avail_in = sizeof(dummy_head);
                if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
                {
                    return false;
                }
            }
            else 
                return false;
        }
    }
    if(inflateEnd(&d_stream) != Z_OK) 
        return false;
    *dest_length = d_stream.total_out;
    return true;
}

然后我是这样调用的,

bool HttpHandle::Decompress(ofstream &out_stream)
{   
    out_stream << "Decompress() is called" << endl;

    char *tmp_buffer = new char[BufferSize];
    memset(tmp_buffer, 0, BufferSize);

    unsigned long data_length = 0;
    if (!GzipDecompress((Byte*)m_content_begin, m_content_length, 
        (Byte*)tmp_buffer, &data_length))
        return false;

    m_content_begin = tmp_buffer;
    m_content_length = data_length;

//  out_stream << "content--------\n" << tmp_buffer;
//  out_stream << "end------------" << endl;

    return true;
}

GzipDecompress总是可以成功返回,但是,tmp_buffer里面却什么都没有,解压后的数据长度data_length也是0. 然而把收到的压缩数据写入文件,却可以用命令gzip成功解压。
现在找不出是哪个位置出了问题,希望懂得的人能够帮我一下。

1个回答

wqz521nh
wqz521nh   2014.05.29 15:24

同问 我是用libpcap抓http包,解压gzip 也是压缩数据长度为0 buff为空

wqz521nh
wqz521nh 也发现是这个问题~~~ 调试下发现了这个问题 自己蠢了 长度适当大点没关系的
大约 4 年之前 回复
zuofabutong
zuofabutong 我后来发现是GzipDecompress这个函数的参数传错了,不能传0进去,这个in-out参数,要把缓冲区的长度传入,调用后就得到解压后的数据长度
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
使用zlib库函数实现http报文的解压
最近做项目的时候遇到了一个问题,那就是需要获得http响应报文主体内容,一般响应主体会通过gzip格式进行压缩,本文就是针对这种情况所写的,可以进行内存解压,而不需要保存至本地文件再解压。至于chunked分块传输方式要先进行报文重组再进行解压,本文暂不考虑。 下图是我抓取的一个http数据包,由Content-Encoding:gzip\r\n知该报文经过了gzip压缩,而压缩后的长度可以根据
利用zlib库对HTTP收到的gzip数据解压
1、首先说为什么采用zlib解压,因为zlib可以解压内存数据。 2、下载zlib库后,自己在projcts目录里面根据需要编译lib库 3、静态链接只需要zlib.h ;zconf.h;zlib.lib三个文件即可(动态的不介绍了) 4、解压函数: /* HTTP gzip decompress */ int httpgzdecompress(Byte *zdata, uLong nzd
使用zlib开源库解压时内存崩溃问题解决
最近一个项目中用到了解压缩,打算使用zlib开源库封装quazip在qt中开发,但是在解压缩过程中遇到了内存崩溃现象,错误指向了inflate_fast里面的汇编模块。最后经过分析发现是编译zlibwapi.dll的时候使用汇编模块造成的bug。 解决方法用c编译方式取代汇编方式,在zlib源码的zlibvc工程属性-预处理器定义里面去掉 ASMINF 定义,这样就可以屏蔽掉汇编模块了。 但是
Zlib库对网页中deflate压缩数据的解压
Zlib解压deflate算法压缩后的数据
用zlib压缩与解压数据
linux中有开源的zlib-1.1.4,只要在程序的lib库中包含上libz.a在程序中#include "zlib.h"就可以了.压缩的函数是:int compress(Byte *sBuffer, uLong& nDataSize, const Byte* buff, const uLong len);解压函数是:int uncompress(Byte *sBuffer, u
Linux下使用zlib实现数据压缩解压
本文举例说明了:项目过程中字符串数据传输的场景下(文件名列表),如何使用数据压缩减少带宽的开销; deflate(RFC1951):一种压缩算法,使用LZ77和哈弗曼进行编码; zlib(RFC1950):一种格式,是对deflate进行了简单的封装,他也是一个实现库(delphi中有zlib,zlibex) gzip(RFC1952):一种格式,也是对deflate进行的封装。 gzip = gzip头 + deflate编码的实际内容 + gzip尾 zlib = zlib头 + deflate编码的实
[Qt]简单使用 Zlib 库压缩/解压数据
一直想解码酷狗的krc格式文件,但是苦于没有找到资料,最近在吾爱破解发现了一篇文章讲解码krc文件的(地址),我就打算自己试试。文中解码使用了 zlib 库,所以便看看如何使用Zlib库,也算是积累一点知识吧。 在写这些代码的时候,遇到了一些问题,就包括上一篇讲的Qt断点无法断下,还有QByteArray的对象转char *时会截断'\0'(我最想吐槽这一点,花了我很长时间在解压函数上)。
c++ zlib实现gzip压缩字符串
地址:http://www.oschina.net/code/snippet_65636_22542 因为最近需要像web上报些数据,对接的web是统一的接口,需要我这边对数据进行gzip压缩以及base64编码,在网上找到了利用zlib来实现gzip压缩的代码,zlib安装添加到工程前面一篇文章已经提到了,有疑问可以去看,安装了zilb才能用下面这段代码。 1
LINUX、C#下使用zlib进行对称压缩、解压
zlib是一个压缩库,封装了多个算法,我们这里使用的是zip。 一、准备zlib的LINUX及C#库 zlib项目地址: http://www.zlib.net/ zlib.net项目地址(for C#): http://zlibnet.codeplex.com/ 二、操作函数 在C#下压缩解压: using ZLib
使用zlib解压标准zip文件
zlib库可以解压zip压缩数据,但是在做标准zip文件解压的时候发现会出现问题,原因其实是因为zlib的压缩格式与标准zip的压缩格式有那么一点区别,最初这个问题让我很纠结,在经过实验后,我将标准zip压缩的文件与使用zlib库函数压缩的文件使用二进制编辑器打开时发现了它们的一点点区别,使用zlib库函数压缩后的数据与标准zip压缩后的数据相比在头部多了个0x9c78,(而且数据的尾部也稍有不同