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 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程