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完整解压