|
|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能.* n+ Q4 e2 q2 ~7 l7 _9 n1 B$ R
5 n8 J8 c7 @+ Y% k4 F1. 如何获得zlib
- B: V) u7 A& z% x
) b& C/ u: E2 ?2 }zlib的主页是:http://www.zlib.net/
3 k& N- h; X* ~: f1 G " `/ H1 v3 a) s+ q- \' R* Q
2. 用VC++6.0打开4 K% Z1 u% N( [& x
/ `3 H2 O. s) X. ]8 j3 Z6 V
把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).
( d q+ N/ G2 D' [3 X) Q
& o' {8 D, g1 e, P9 i6 D( t0 x/ \3. 如何加入到我的工程( g4 {! M0 B9 E) Y0 F
# s: ], l& h8 j7 s0 \编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧.
+ U* B# ?7 ~; v! S9 z
1 p0 @( j2 i0 y4. 用zlib能干什么
* s0 }. N' n& k6 i c( L4 D; L
: I0 c6 A2 [; [( V5 U先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.
; N. e' [& j. J8 N$ L8 ] 9 S$ g6 Q+ q* r o0 E, A0 s4 w+ Z
关键的函数有那么几个:
4 t$ _- e E% r/ x/ [; `% T ; ~7 v) P/ n* p( {* z( r4 `* p+ _
(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
) V( H( ^: O! E& U4 l- G @
; C4 ^6 {0 c/ A* B6 c: d把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定& b4 ^% r& k8 ~9 o0 u: I( F
, ]: U |$ X/ X f+ A
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
~4 }; ]6 F1 g$ `' e 8 M7 {, y* D% |' _9 N `. `6 y
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间
( H1 {0 ~' s4 s6 b
4 X9 E! S0 C% _6 q, p7 m) s! Y: t1 [' Z(3) uLong compressBound (uLong sourceLen);
- Z# H) S, O( g 8 n3 t r+ o9 e
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度; N6 d' n" H" F# r. S5 A. C- j% O
4 X+ W! }! J; U2 t+ y( B6 o/ A9 ]5 j4 k3 _
(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
* _4 o7 q+ T; h) S3 c+ l1 i3 D) A ) f1 ~8 f( _+ y, J" { V
解压缩(看名字就知道了:)
4 c) e' K; u7 l* ^: S! N
* S! s6 l* t* N7 ?; |" z8 c(5) deflateInit() + deflate() + deflateEnd()
5 S( E0 h0 ?) N+ l
2 ^% {0 x6 @8 z/ Z4 {3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)
$ |0 y5 `6 f* ^' ^6 [) h5 S; |
7 C. D' B7 J/ P9 }1 u(6) inflateInit() + inflate() + inflateEnd()
/ T8 K1 t9 P* y6 |
4 Z7 l6 B- w' o. J( h和(5)类似,完成解压缩功能.( }9 f: F* h# y& D I
( A2 }' t5 C* m: T5 P
(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.
; T [, ?5 t* y/ q" |0 k3 Z 6 ~ O; d& o7 j! r/ T, r
(8) 其他诸如获得版本等函数就不说了.
; }. Z+ p, Z7 q总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.
' A5 @) D4 G: z W 4 S U/ r3 r( W: m C6 b$ o% n
题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.
" b* u, \1 L) G }, {/ ]! h M1 O4 q/ B9 S9 A
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx
, Q* [. E; E3 P* ^0 X5 O |
|