zlib导入到工程与数据压缩

一.将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 *destLenconstBytef *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 *destuLongf *destLenconstBytef *source, uLong sourceLen);

解压缩函数有4个参数:

①   Bytef *dest:目标缓冲区,用于存放解压缩后的文件数据,大小已分配好

②   uLongf *destLen:目标缓冲区大小。其数值即①的缓冲区大小的值。当函数执行成功后,该值会被修改为准确的解压缩文件数据块大小

③   constBytef *source:源文件数据块,即需要解压缩的数据文件,这是已知的

④   uLong sourceLen:源文件数据块大小,这是已知的

同压缩函数相同,解压缩函数同样需要在函数执行之前对目标缓冲区大小进行分配。但是,对于压缩函数,有compressBound可以获取建议目标缓冲区大小。对于解压缩函数,却没有类似函数。这需要用户额外做一些工作来计算。

4.     返回值

对于compressuncompress,根据不同的执行结果,会有不同的返回值:

①   执行成功:返回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文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值