zlib 对http协议中的gzip解压

gzip数据可以用zlib解压, 很多人用的是去掉gzip头10个字节再解压, 这个情况数据可以解压出来, 但是程序会报错

strm->msg = (char *)"incorrect data check";

查看相关代码可以看到这个是效验检查不对

/* check function to use adler32() for zlib or crc32() for gzip */
#ifdef GUNZIP
#  define UPDATE(check, buf, len) \
    (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))

从这可以看到gzip使用的效验算法是不一样的, 再找state->flags

            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
                state->check = crc32(0L, Z_NULL, 0);
                CRC2(state->check, hold);

从这可以看到, 库本身是支持gzip方式, 但是state->wrap值不对, 继续查找

    if (windowBits < 0) {
        state->wrap = 0;
        windowBits = -windowBits;
    }
    else {
        state->wrap = (windowBits >> 4) + 1;

从这看到 windowBits 也就是 inflateInit2的参数

自行定义一个 #define GZIP_BIT 0x2F

nWndBit = bGzip ? GZIP_BIT : DEF_WBITS;
nError = inflateInit2(&zstream, nWndBit);

这样zlib可以直接把gzip完整解压

posted @ 2022-01-22 21:40  Yofoo  阅读(345)  评论(0编辑  收藏  举报