n小白 2016-10-08 09:58 采纳率: 100%
浏览 1078
已采纳

使用zlib1.2.8解压http中经过gzip压缩的数据,函数运行错误

使用的是vs2015,zlib1.2.8
使用相同的参数运行inflateHTTPGzip函数返回的不同结果:

  • 1.inflate 函数返回-3
  • 2.解压结果长度小于正确长度(只正确解压一部分数据)
  • 3.正常运行,结果正确

请各位前辈帮我看看是哪里出了问题

    int inflateHTTPGzip(void * dest, unsigned long destLen, void * src, unsigned long srcLen, unsigned long * outputLen) {
        char * pDest = (char *)dest;
        char * pStart = NULL;
        char * ptr = (char *)src;
        unsigned long size = 0ul;

        pStart = strstr((char*)src, "\r\n\r\n");
        if (!pStart) {
            return INVALID_STRING;
        }

        pStart += 4;
        if (sscanf_s((char*)pStart, "%x", &size) != 1) {
            return INVALID_STRING;
        }

        pStart = strstr((char*)pStart, "\r\n");
        if (!pStart) {
            return INVALID_STRING;
        }
        pStart += 2;

        z_stream d_stream ;
        ZeroMemory(&d_stream, sizeof(z_stream));
        d_stream.avail_in = size;
        d_stream.next_in = (unsigned char *)pStart;
        d_stream.avail_out = destLen;
        d_stream.next_out = (unsigned char *)dest;

        int err = 0;
        if ((err = inflateInit2(&d_stream, 47)) != Z_OK) {
            return ZLIB_ERROR;
        }

        if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_STREAM_END ){
            return ZLIB_ERROR;
        }

        if ((err = inflateEnd(&d_stream)) != Z_OK) {
            return ZLIB_ERROR;
        }

        *outputLen = d_stream.total_out;

        return SUCCESS;
    }
  • 写回答

2条回答 默认 最新

  • n小白 2016-10-18 04:32
    关注

    update
    自问自答:
    我没注意到Http1.1中的chuncked字段,数据有时是分段传输过来的。
    上面的函数是没问题的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页