|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能.; }$ x& a5 n5 y' A$ b8 f8 q6 K
6 T: k- a- U9 W0 a- L5 R1. 如何获得zlib3 s9 L! q+ v9 q/ D V
! b: o! @) f; \; z9 Jzlib的主页是:http://www.zlib.net/, ^, F8 n7 g8 c
" H$ f$ _0 m5 d3 b2. 用VC++6.0打开
, }3 s' [/ d D0 l+ K 2 T7 ~- V! c% e9 W2 P
把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用)., w/ [; n# G) ]7 M& [( w
8 `1 F5 X; n7 O6 a3. 如何加入到我的工程7 x4 _: w7 X- L
( p* N& `6 z* K5 c
编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧." `9 _7 S2 C: I8 u
, d6 |( H+ h: u4. 用zlib能干什么7 }' E& }3 \4 O t7 P- ]
" D8 n$ l/ c( v6 L7 d y5 |先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.
( x/ J5 G7 u+ {# _ 5 x9 I' E9 R5 `) T$ \; S3 }
关键的函数有那么几个: J$ `( a+ C( K8 P$ r4 Q
% ^0 j0 }, M+ S$ H; V$ V1 Z, o(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
% Y0 g" _' ~ O" F# s4 ? 2 T [" X" O, a \
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定
. u3 R- B: R" q! F% \) [ 5 O }3 d# o/ D, _" M6 K% k
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);+ J+ Y; h7 M5 A7 {
D6 d- E2 R9 p' n4 t: |
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间: A. n+ E7 b& Q. r; J ^: R9 c4 g# D
& c! T" ^9 v2 u
(3) uLong compressBound (uLong sourceLen);( K, ?9 [, ]1 e+ |: t! P
- q9 }) A" W% {2 j1 {( F计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度6 n$ N4 e3 n4 I0 A% Z. t( k
4 I& T0 }+ I/ E! ]+ Q7 I3 F+ f0 \2 j$ R
(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);8 D! R6 w9 v* O1 u! |& d- P( q x
# k* g" y0 r$ {: V" ]. W- F) E
解压缩(看名字就知道了:)
' G& ]1 g8 _' f ( \3 Y k2 N# c1 _# n) i
(5) deflateInit() + deflate() + deflateEnd(): S# F2 y4 U2 S/ P
# i0 Q- q& V1 |
3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)4 Z5 Y0 Q. m! y5 Z
. {0 S& ` {+ f" b* {$ i( Z
(6) inflateInit() + inflate() + inflateEnd()) Q/ P% D! e6 }/ N6 a/ X# I$ W6 q
; d) u, L, M. j2 [. s4 M& ]3 @. a- }和(5)类似,完成解压缩功能.* b( S' f$ L+ n: u
- q- \3 y3 M; @+ F(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.+ b+ ]! o2 S) A6 q. n: C
( a9 }3 R# L7 j i/ ]9 k6 n. i
(8) 其他诸如获得版本等函数就不说了.
. c$ b( T; @7 A- N/ L总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.
2 D7 A" h6 @$ I 0 j' ~: Z. L- [+ i* \$ U! \ ?& S2 W4 B
题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.
0 s6 T) P0 O" ~3 E
5 V0 ]( x. S- R( N. ^9 R2 |本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx: q, r% O6 Z# D* X9 U% c3 G% k
|
|