|
|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能.7 N& |+ }: K: ^3 @( ~, ~
. e" w+ S+ a4 f% ^) x/ C' D8 _1. 如何获得zlib |) Y% p( f4 H5 i
# U3 |. E8 K) g+ d( v
zlib的主页是:http://www.zlib.net/
0 L: ^* P9 \1 I3 ]2 [ m 8 ^) j5 `6 y" g: ?; X
2. 用VC++6.0打开5 F0 s: H' w9 n3 a; p
4 P: ~5 k/ E3 U! ]9 Y4 @6 x把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).0 v8 U0 G- T, D1 t& }4 q' @$ M2 j0 R
! A) ~% _" [5 j6 G3. 如何加入到我的工程) w& \9 X8 x9 U
' m5 Q" K- K2 `6 p$ |
编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧.
7 Q5 c9 Z, E; @# Q# o- }9 W
8 X/ [3 o- z* T- C4. 用zlib能干什么
6 `& N; i! H9 z7 u: T7 b5 [% @8 h
: h& t& r: K. A$ A) d4 X8 [# ?0 F先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.
' B" m7 d- H0 l; @# S" D5 f 1 d2 K7 P- P6 o3 H' @" t4 p1 w
关键的函数有那么几个:
' R" @! F8 ]$ \" _, u( M5 _7 \4 U 9 H. `. H8 V/ {6 e9 }, ~" @
(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);4 l+ a0 O! u( E) U
8 o; d' W% M7 j7 W% ^" ~) ^1 J8 G5 [把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定
: z7 }5 Z7 a) @8 `% [ 4 d: [$ S1 t& i
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);1 q+ _2 g1 K+ C) l' A! k5 N; ~
9 u, L% K. G4 g4 G* o, R5 o+ ?
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间6 h, I5 P3 U$ T* V6 V( U
$ r( h2 t$ |. Z: y# V. t& D& b(3) uLong compressBound (uLong sourceLen);
2 Y$ F3 C. [! s5 ^# V ? 1 N2 L9 o4 |! R* ~0 \+ x- S
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度
: k8 c) q7 j8 O9 g
4 B8 f$ a/ f: A" s; C(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
1 ?. ?' g3 E% `
' X5 l6 e! R6 F* O* i' j解压缩(看名字就知道了:)9 X* e% X% X- Q
- O b4 }; f- d1 v: J(5) deflateInit() + deflate() + deflateEnd()$ L3 x+ ~5 r7 ?5 |& d. [( w
3 g0 a6 \ _- o) K, q4 h9 F7 Q3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)
& O% _: P* n) Z, r 5 r* s/ I( K: h* O7 w3 U
(6) inflateInit() + inflate() + inflateEnd()
- b. y2 V. t$ p 2 i% N; @5 N; f0 J X; v Q: q$ i' w
和(5)类似,完成解压缩功能.
* h* L+ w& q) i+ C. A! Y
' `& z& Z% A2 r( G/ ?1 c(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.) x7 C4 K8 z% s
) z7 z/ v. G9 |/ }3 W" D3 f5 Z3 Y9 K
(8) 其他诸如获得版本等函数就不说了. - a: {$ }7 S* P' \
总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.% n+ G" P+ |- V5 R7 C/ P/ Q
7 z1 z; ?6 A7 g- |. G题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.
- b' ~: w% E% j5 W) C. B, J# U3 N, W, C v0 [
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx
. \5 P- j/ u; l7 a" J |
|