|
|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能." r- l( ?' K8 K* q
! ]" H! {, A" r! ]5 ~1. 如何获得zlib
; @% p( }5 @. @1 M . x+ O1 B+ z6 {0 }
zlib的主页是:http://www.zlib.net/, x( V& G/ o F5 v5 M- _" I2 A
0 K) \4 B6 v& p0 U& H& O2 O2. 用VC++6.0打开
: Y/ F! G$ E3 c; ^. M 0 n0 g; T3 o+ ]8 C% m5 u% W
把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).
; `5 O( }" ^7 g1 A; q, P
" `! l5 _5 i8 }5 W! U8 @! C3. 如何加入到我的工程, w# W* `* V0 V8 x- a; b: X1 L
+ d! k; ^" l8 a4 v* O# R+ q- ]
编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧.
6 E- x! Y: m; y2 B6 }, R8 ^5 ]0 c
5 p3 f9 d: |# T* H2 t4. 用zlib能干什么$ {3 I; ^/ R0 c9 H( x
$ i( p: g9 N3 N先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.# p, k. t8 f7 a) D( R
; K, _ c! ]/ ]
关键的函数有那么几个:* W5 P9 W+ H6 R8 M$ V! D
# ^3 ]6 F2 q/ f4 P5 M V. H) M
(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
* p5 a' W- t" G( b1 W; O1 ] 5 A: x) a5 C5 t3 { C! x6 u
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定. a8 v t' K% a \& o3 h* @; e
. T# m$ V) ~* a8 d
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
- K5 K1 B- b1 s8 U1 g: u
0 i/ R# c* [0 M# N' p" y( B+ N功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间! [, n0 K" u* j: r
* u" |6 [, n9 y) i ~: O(3) uLong compressBound (uLong sourceLen);: B: b6 |" e6 \- x+ S
. Y$ l- f9 N3 P2 \! H计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度
K! J0 @9 M3 \1 I+ n8 b: n" d : {; s w6 x7 F) Q8 o6 W
(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
0 s9 `6 N. g- B5 M 1 f% j G5 V( j! w3 ]0 J
解压缩(看名字就知道了:)
3 S( D/ {. I4 H0 w" R7 c0 F " h/ @ K2 A5 m/ t6 [7 a/ a1 h h
(5) deflateInit() + deflate() + deflateEnd()" n% ^: X4 s# B6 j& l5 l
7 ~. v7 [! a" }2 Q# N1 V: r3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)8 Q% p# A% @$ s9 K; g. I! I9 a9 ?
' q% V" Y( Y8 ~7 l3 @' {: h) U(6) inflateInit() + inflate() + inflateEnd()
* g/ Z6 q' `) _- S# @ % \# n- w( m/ p$ H' G
和(5)类似,完成解压缩功能.) }9 e, f1 N: C2 Z" }3 Q' k5 w
, e2 `( z& S% @8 k9 I0 G- ~2 j# k
(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.
: E" O* a, D; P8 o # S( p1 V2 V( c' k8 Y
(8) 其他诸如获得版本等函数就不说了. + S* C0 _/ v2 b% y
总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.) A) x# I( s* F# F
! S& W' x9 L7 c题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.( D2 O; _; }# b% {. ^' S* t" f$ |+ d9 O- r
4 V2 K# c# p( t+ S
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx
& \8 l: i$ J: X |
|