|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能.
+ @0 v; z* |& d4 f ! K, H" L, y% M: y1 ~ F
1. 如何获得zlib
+ ?) z! K* c5 o) Q" Z" N
6 y" G5 }6 d3 x Pzlib的主页是:http://www.zlib.net/+ G/ C* Y7 L8 I8 H4 ]( j) t% v
( _6 }; y `/ ^' \4 L, Z2. 用VC++6.0打开
7 m0 O. b. B+ `( r 7 x! Q' W6 Y! O A- [
把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).
! {) Q! i. S/ E' ?
$ F' M) \' V% Z5 _; n* |& _% n3. 如何加入到我的工程
9 ~9 X% k# W! ^6 ~ 9 k) a0 A0 J) \4 U/ ?
编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧.7 E3 `3 e- \. L' a# y4 o+ p
6 I# m* i3 b- }% u* W* L6 s( }
4. 用zlib能干什么
1 W' g7 i$ q7 M! ~* ]8 s8 P& Z8 p , X G4 j' t5 O$ n4 Y# C. Y- Z
先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.
/ T& k' F# Z, x u* F 0 q& L* [# U D+ q
关键的函数有那么几个:
, E, ~6 d. r1 d& v1 ^, H6 L4 f8 q
2 d; H+ F/ f7 c: M(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);7 F4 a) O$ Y, r4 d0 T
7 T3 y3 v% F& E& ?3 Q% X
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定
$ `9 t U) i6 E% d 8 }2 L) t8 [; r3 S' G @, N
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);$ S" w' P1 F' U) E! G$ o$ G5 p) w) R4 I
; Q+ g5 Z) z, O/ |: T
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间
5 V' n# B' g( j8 G! f3 C 9 }! R; l' y2 T
(3) uLong compressBound (uLong sourceLen);7 @/ z1 L, J2 t3 H" t" ~; S( {, m+ ]
# [* l( T) [. g/ s
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度$ U* {) L* Z5 J4 K
4 I5 n/ a( v& ?2 z
(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
4 m+ H$ Q& `3 n
% Y2 B; Z0 a) v8 I. V/ r解压缩(看名字就知道了:)
- |* I' h) n2 H1 ?: u % d4 w1 J2 c& F# A+ e. ?" L9 u
(5) deflateInit() + deflate() + deflateEnd()+ ~. J9 o" N6 S9 b# I
3 T+ t7 z# [( }4 [7 z5 O; w6 n6 A. v3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)
- T1 Z3 C+ z, D, z) y# V
' S; q. a) Q* A! l8 q9 ~ a% @! P& f# P(6) inflateInit() + inflate() + inflateEnd()
! N, l0 I7 f; L6 a' U$ s+ x ! r) e- i O, |4 U% s
和(5)类似,完成解压缩功能.
9 B& {7 f. \- `1 d ?, C 0 ]: }: L# O; A: K
(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.
7 B0 h& i! S9 R5 g0 M4 j5 e5 h 6 R& K& q8 l" o5 S% v' l% d) S0 B$ \
(8) 其他诸如获得版本等函数就不说了.
8 x. c8 M" k0 L% X0 ?. e( W总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.
+ V1 W! @3 M1 a- q! k7 \! O- ~# C+ K6 B 1 a h- x8 ]! i; d! ^& ~# H
题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.
& n1 D; ^' G5 i" F
( k1 Q$ x( e, W) c8 o本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx* l: ?# H. C- Z0 @# e. H; K$ m q, {+ e3 a
|
|