一.将zlib导入到工程中
1. 编译zlib库后,会生成一个ZlibDllRelease文件夹(Release版本)和一个ZlibDllDebug文件夹(Debug版本)。使用zlib库,共需4个文件:
① zlib-1.2.8的根目录下的zconf.h和zlib.h
② ZlibDllRelease文件夹下的zlibwapi.dll和zlibwapi.lib
根据需要编译的工程是Debug还是Release,选取不同的库文件。
通常使用Debug版的文件。
2. 创建一个新的项目,将1中的4个文件复制到项目的目录下,将两个.h文件导入到工程中。
在工程上点右键,选属性,在C/C++→预处理器选项中,右侧的页面第一项为预处理器定义,在其中添加:ZLIB_WINAPI。
3. 在工程中包含头文件并导入库:
#include "zlib.h"
#pragma comment(lib,"zlibwapi.lib")
若要使用zlib本身定义的一些数据结构,比如Byte,uInt,uLong,voidpf等,还需要包含:
#include "zconf.h"
即可。
二.使用zlib
1. 压缩
intcompress ( Bytef *dest, uLongf *destLen, constBytef *source,uLong sourceLen);
压缩函数有4个参数:
① Bytef *dest:目标缓冲区,用于存放压缩后的文件数据。大小已分配好
② uLongf *destLen:目标缓冲区大小。其数值即①的缓冲区大小的值。当函数执行成功后,该值会被修改为准确的解压缩文件数据块大小
③ constBytef *source:源文件数据块,即需要压缩的数据文件,这是已知的
④ uLong sourceLen:源文件数据块大小,这是已知的
压缩函数执行完成后,destLen /sourceLen即压缩率。
目标缓冲区及其大小是需要在执行函数之前就分配好的。那么分配多少就成了问题。考虑到这是压缩函数,故目标缓冲区必然<=源文件大小。所以将其设为与源文件大小相同必然是可以的。不过zlib库提供了一个参考函数compressBound,该函数会给出一个大小必然足够的建议值。详见2。
compress还有一个扩展函数:
intcompress2( Bytef *dest, uLongf *destLen, constBytef*source,uLong sourceLen, int level);
该函数相比于compress,多了一个level参数,该参数用于压缩的级别,值为0-9,可指定压缩质量和压缩速度的关系。压缩比越大,所耗时间越长。
2. 压缩包建议大小
uLongcompressBound(uLongsourceLen);
该函数用于配合compress函数使用。
传入源文件的大小sourceLen,该函数会给出一个目标缓冲区大小的建议值。该建议值并不一定准确,但其大小必然足够放下压缩后的文件。
3. 解压缩
intuncompress (Bytef *dest, uLongf *destLen, constBytef *source, uLong sourceLen);
解压缩函数有4个参数:
① Bytef *dest:目标缓冲区,用于存放解压缩后的文件数据,大小已分配好
② uLongf *destLen:目标缓冲区大小。其数值即①的缓冲区大小的值。当函数执行成功后,该值会被修改为准确的解压缩文件数据块大小
③ constBytef *source:源文件数据块,即需要解压缩的数据文件,这是已知的
④ uLong sourceLen:源文件数据块大小,这是已知的
同压缩函数相同,解压缩函数同样需要在函数执行之前对目标缓冲区大小进行分配。但是,对于压缩函数,有compressBound可以获取建议目标缓冲区大小。对于解压缩函数,却没有类似函数。这需要用户额外做一些工作来计算。
4. 返回值
对于compress和uncompress,根据不同的执行结果,会有不同的返回值:
① 执行成功:返回Z_OK
② 内存不足:返回Z_MEM_ERROR
③ 目标缓冲区大小不足:返回Z_BUF_ERROR
④ 输入的源文件数据有误:返回Z_DATA_ERROR
以上函数为zlib的压缩与解压缩的函数及用法。
这里所谓的压缩即数据压缩,而非操作压缩包。
如果要操作zip格式的压缩包,需要调用zlib-1.2.8\contrib\minizip文件夹下除miniunz.c和minizip.c以外的.h与.c文件。