数据压缩处理库-zlib
2013-05-24 09:48:24 阿炯

zlib是提供数据压缩之用的函数库,由Jean-loup Gailly与Mark Adler所开发,在1995年5月1日发表。zlib使用抽象化的DEFLATE算法,最初是为libpng函数库所写的,后来普遍为许多软件所使用。其全称为"zlib library",意指"zlib 压缩库";旨在提供一个快速、可靠且稳定的压缩库,以应对当时互联网上快速增长的数据传输需求。初始发布的版本是0.9版本,之后经过多年的演进,发展成为今天广泛应用的压缩库。此函数库为自由软件,使用zlib协议授权。


zlib是一个通用的数据压缩库,适用于数据压缩的函式库,几乎适用于任何计算器硬件和操作系统。因为其代码的可移植性,宽松的授权许可以及较小的内存占用,其在许多嵌入式设备中也有应用。

zlib is designed to be a free, general-purpose, legally unencumbered -- that is, not covered by any patents -- lossless data-compression library for use on virtually any computer hardware and operating system. The zlib data format is itself portable across platforms. Unlike the LZW compression method used in Unix compress(1) and in the GIF image format, the compression method currently used in zlib essentially never expands the data. (LZW can double or triple the file size in extreme cases.) zlib's memory footprint is also independent of the input data and can be reduced, if necessary, at some cost in compression.

特性
主要特性包括:

数据压缩和解压功能:提供了强大的压缩和解压缩算法,能够在保持较高压缩比的同时实现快速的数据处理。

支持多种压缩格式:除了自有的"deflate"压缩格式外,还支持gzip压缩格式,使其在不同应用场景中更具灵活性。

简单易用的API:Libz库的API设计简洁清晰,易于集成到各种编程语言和应用程序中。

跨平台性:支持各种主流操作系统,包括Windows、Linux、macOS等,使其在不同环境下均能稳定运行。

高性能:Libz在压缩和解压速度上有着优异表现,使其成为许多软件开发者和系统管理员首选的压缩库。


功能
数据头:zlib能使用gzip数据头(header)、zlib数据头或者不使用数据头压缩数据。通常情况下,数据压缩使用zlib数据头,因为这提供错误数据检测。当数据不使用数据头写入时,结果是没有任何错误检测的原始DEFLATE数据,那么解压缩软件的调用者知道压缩数据在什么地方结束。gzip数据头比zlib数据头要大,因为它保存了文件名和其他文件系统信息,事实上这是广泛使用的gzip文件的数据头格式。注意zlib函式库本身不能创建一个gzip文件,但是它能够相当轻松地把压缩数据写入到一个有gzip文件头的文件中。

算法:目前zlib仅支持一个LZ77的变种算法,DEFLATE的算法。这个算法使用很少的系统资源,对各种数据提供很好的压缩效果。这也是在ZIP档案中无一例外地使用的算法。(尽管zip文件格式也支持几种其他的算法)。看起来zlib格式将不会被扩展使用任何其他算法,尽管数据头可以有这种可能性。

使用资源:函式库提供了对处理器和内存使用控制的能力。不同的压缩级别数值可以指示不同的压缩执行速度。还有内存控制管理的功能。这在一些诸如嵌入式系统这样内存有限制的环境中是有用的。

策略:压缩可以针对特定类型的数据进行优化。若使用者总是使用 zlib 压缩特定类型的数据,那么使用有针对性的策略可以提高压缩效率和性能。例如,如果使用者的数据包含很长的重复数据,那么可以用RLE(运行长度编码)策略,可能会有更好的结果。对于一般的数据,默认的策略是首选。

错误处理:错误可以被发现和跳过,数据混乱可以被检测(只要数据和zlib或者gzip数据头一起被写入)。此外,如果全刷新点(full-flush points)被写入到压缩后的数据流中,那么错误数据是可以被跳过的,并且解压缩将重新同步到下个全刷新点。(错误数据的无错恢复被提供)。全刷新点技术对于在不可靠的通道上的大数据流是很有用的,一些过去的数据丢失是不重要的(例如多媒体数据),但是建立太多的全刷新点会极大地影响速度和压缩。

数据长度:对于压缩和解压缩,没有数据长度的限制。重复调用库函数允许处理无限的数据块。一些辅助代码(计数变量)可能会溢出,但是不影响实际的压缩和解压缩。当压缩一个长(无限)数据流时,最好写入全刷新点。


使用方法
使用Libz库进行数据压缩和解压通常包括以下步骤:

包含头文件:在代码中包含Libz库的头文件,通常是#include <zlib.h>。

初始化压缩或解压环境:使用Libz提供的函数初始化压缩(或解压)环境,设置相应的参数。

执行压缩或解压操作:调用Libz提供的函数进行实际的压缩或解压操作,处理输入数据流和输出数据流。

释放资源:完成压缩或解压后,释放相关的资源,确保程序运行效率和内存管理的良好。


应用案例
Libz库在各种软件开发中都有广泛的应用,例如:

Web服务器和应用程序:用于HTTP服务器端的数据压缩,提高数据传输效率。

文件压缩和解压工具:作为压缩工具的核心库,例如gzip。

数据库系统:用于在数据库中压缩存储数据,节省存储空间和提高查询效率。

嵌入式系统:由于其高性能和小尺寸的特点,常用于嵌入式系统中的固件更新和数据传输。


关于zlib授权
zlib授权是一个自由软件授权协议,但并非copyleft。版权持有人为Jean-loup Gailly和Mark Adler(1995-2004)。 类似BSD许可,除了必须注明来源,并在发布的软件中保留此授权协议副本。

最新版本:1.3
1.3.1 现已于2024年1月下旬发布,有以下主要变化:
拒绝 minizip 中 zip header field 的溢出
修复 inflateSync () 中位缓冲区中保存的数据的错误
添加 LIT_MEM 定义以使用更多内存来实现小幅压缩加速
修复 minizip 中 Zip64 end records 的 emission 决定
为 zError () 使用的 ERR_MSG () macro 添加 bounds checking 功能
消除 miniunz 中的 zip 文件遍历攻击
修复 check_match () 中 ZLIB_DEBUG 编译的错误


官方主页:http://zlib.net/