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

使用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条回答 默认 最新

  • u010941298
    n小白 2016-10-18 04:32
    已采纳

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

    点赞 评论
  • u010941298
    n小白 2016-10-18 04:33

    还有函数找\r\n那个位置可能会出bug

    点赞 评论

相关推荐