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条)

报告相同问题?

悬赏问题

  • ¥20 iOS绕地区网络检测
  • ¥15 python验证码滑块图像识别
  • ¥15 根据背景及设计要求撰写设计报告
  • ¥15 QT6颜色选择对话框显示不完整
  • ¥20 能提供一下思路或者代码吗
  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1
  • ¥15 DS18B20内部ADC模数转换器