一般情况下网页请求的头里会有一个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);
解压缩数据,同样的
Zlib库对网页中deflate压缩数据的解压
最新推荐文章于 2024-08-13 10:44:01 发布
本文介绍了如何使用zlib库处理网页中通过deflate算法压缩的数据。讲解了deflate与gzip的区别,以及zlib库在解压gzip和deflate数据时的不同初始化方法。重点讲解了zlib库中的关键函数,如deflateInit(), inflateInit2(), compress()和uncompress(),并提供了解压从网页获取的deflate压缩数据文件的示例代码。"
79185927,5005465,行列式与线性方程组的解法——克拉默法则,"['线性代数', '数学', '机器学习基础']
摘要由CSDN通过智能技术生成