Zlib库对网页中deflate压缩数据的解压

 网页请求的头里有一个Content-Encoding字段来表示该网页启用了压缩算法来提高网页传输效率,一般情况下都是以Gzip或deflate为字段值,实际上是以deflate压缩算法来压缩的数据。
deflate 是最基础的算法,gzip在deflate的rawdata前增加了10个字节的 gzheader,尾部添加了8个字节的校验字节(可选 crc32 和 adler32) 和长度标识字节。

zlib库是一个C++常用的解压zip文件的库,提供了各种各样的接口以供调用。其中,deflate使用inflateInit(),而gzip使用inflateInit2()进行初始化,比 inflateInit()多一个参数: -MAX_WBITS,表示处理raw deflate数据。因为gzip数据中的zlib压缩数据块没有zlib header的两个字节。使用inflateInit2时要求zlib库忽略zlib header。

zlib提供了很多接口,在这些复杂的操作之上封装了最简单的两个接口,compress和uncompress。我们一般直接调用就可以了。

简单介绍下常用的函数:
1、 deflateInit() + deflate() + deflateEnd()
3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)

2、 inflateInit() + inflate() + inflateEnd()
和上面的类似,完成解压缩功能,uncompress()函数的内部实现使用的就是它们

3、uLong compressBound(uLong sourceLen);
计算需要的缓冲区长度,这个函数并不精确的计算压缩后的数据有多长,但是可以保证压缩后的长度不会这个结果还长,便于分配空间。
接下来就是我们最常用的一对函数

4、int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
压缩数据,要注意的是压缩后的BUF和大小是要预先分配好的,这也是我们为什么要使用compressBound这个函数的原因。

5、int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
解压缩数据,同样的,解压后的BUF大小要预先知道,太小了会解压失败。
一般情况下,compress和uncompress函数足以满足我们的要求。

你可能感兴趣的:(Zlib库对网页中deflate压缩数据的解压)