|
|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能.
. ]3 I/ i& Y- A" G3 ~ 4 L$ i \. \; T: G
1. 如何获得zlib4 ^' z4 h% D# B4 ~& A: ?
6 B0 Y2 d& U g& V @. o
zlib的主页是:http://www.zlib.net/
, ^) C5 ?5 D& p' `
( L4 e5 K4 X& d2. 用VC++6.0打开
H A3 A! [4 Q% ]0 E/ Y ( a, J g& o) x r1 f1 P
把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).& V, c5 \3 o6 F/ g7 u
8 l6 E+ ?) @6 f3. 如何加入到我的工程
) a. e8 Y* e6 E ) c. e% F. x2 L- j" C, ~ _
编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧.0 G" R( _2 I' z* A, P. F& i
3 E) ?0 E* h$ G- \4 I
4. 用zlib能干什么
6 `0 G+ F$ F0 w+ u4 h c( y" T: L$ X, S5 S' v
先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.
% Y6 b% z- r- r1 H) \7 p 5 K1 j1 L" t. z q' `
关键的函数有那么几个:
2 @* b8 O& o( M: l( p/ V; u' U # m. {( K0 m1 M1 x8 s/ v/ V' J
(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
5 T1 _5 y" ^/ N& _+ p/ j3 b% o 8 E. k2 r# P( T2 \- V+ _% W W
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定5 x$ J7 T- @3 t+ Z B4 z& T
% l) h' `( D2 b: c
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);# v# _% l3 [0 t5 o' {, C2 M6 G
4 V# e- _% f# Y G1 t' ?: c功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间
! z- {7 F$ E" e' ^ 3 C+ C+ r, X* m2 A9 v
(3) uLong compressBound (uLong sourceLen);
, P2 z' x( K0 u8 x6 `1 f ' ^6 v5 O, \# \6 Y$ A/ P
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度% q& |" W" c( w8 S, A, J$ }' [/ F
% _* q1 P0 V! z- A(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);% M9 C$ ^: P' M ]* s! ~% p
$ e) B5 Q. l6 t' i解压缩(看名字就知道了:)
& H2 Y: d5 h( C/ z0 s ; m! R; _$ q: B8 A J/ M
(5) deflateInit() + deflate() + deflateEnd()
8 x3 @8 [5 a" j: W+ b/ y& x
8 `4 M2 P) i h3 _$ G3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)
7 V& [9 A) t/ }6 U' e ; H1 j3 \& M- C: P" {
(6) inflateInit() + inflate() + inflateEnd()% \! A# t& i6 K: z9 Z' ~+ i
% ]0 j2 Z" R4 @6 \$ i
和(5)类似,完成解压缩功能.
& z% [ f/ [1 L3 s5 Q
x5 c% M0 }: k6 m+ o(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.+ T- V4 u9 J7 e9 A
' I$ L N9 A! y( D
(8) 其他诸如获得版本等函数就不说了.
+ d0 r6 c6 y/ Q: C( ]总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.
h" S6 ~7 D, B: O2 U- B
9 b: e, k ?/ }% T* e+ u z题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.# T' E0 b! H& c* ^4 q/ p8 H4 X
' e4 E, n5 `+ U/ e
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx. i0 t( |9 {. |3 _% m$ I
|
|