|
|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能.
- J0 }3 g6 B& J* S# ^+ O1 n* q# C
3 s) o) P) L3 F- D. X; q1. 如何获得zlib0 ~7 X' P& B+ A
% W0 m. m+ c4 j# ?$ M
zlib的主页是:http://www.zlib.net/) g- k! `* j' S% G" |
: @8 M3 A: A; g- [, E }% E2. 用VC++6.0打开
8 C" t8 s1 i9 q& G
- j) ^$ K4 m I8 T# w2 v9 u把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).& d4 d5 {6 @) h+ E, d9 i6 y! Q
, I% F! p7 b( T# v' H, i7 \: Q3. 如何加入到我的工程8 e( k+ N8 l W, N; Z# z( \
% l( u2 Y, p8 N6 F( E% O9 _5 e编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧.
& X7 j' ^' @- h* P" i
/ M, ~+ O. S4 r) V4. 用zlib能干什么
: N8 P% b' T, e! j( h1 A
. ~, ]( ?) W/ l% J先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.
/ V% X6 r6 B2 X# _; U/ ^# n ! |5 k8 [( ?/ ^1 z) k5 u
关键的函数有那么几个: x3 y, r! b( b C+ m( w& b
! w8 t R& _, i' s(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);& n0 Y8 F: p- C
4 L/ @' ^7 V; z: w% }1 P" p
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定
. }2 u$ r' s" [# g+ w Z7 @, ` ) Z' B- G2 W0 v4 [
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);0 Y @. h) i2 ^- `" P% @! x
. n [! @8 s$ [6 J* q7 ^功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间$ L+ W9 j& Q6 N3 L+ `. O/ c) E- z2 g
6 S& H; W9 w" M% h+ W(3) uLong compressBound (uLong sourceLen);
, c, D( D" o7 Z5 O+ s$ c ) W. R N! A/ p( X, \- T
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度5 P& ~3 v& [ K' i
" `* ` y) _2 z, e! X0 U, B(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);" G% Y7 q! k5 O8 ]
. A, P9 Z7 }' N$ C
解压缩(看名字就知道了:)! B% T) p. Q) ^5 A
$ f( z$ X& t1 L v4 m
(5) deflateInit() + deflate() + deflateEnd()
0 X- C& X9 N' r; @1 ^' {/ ^" Z 4 l0 f% h" V8 `9 O; ?' _ E( n
3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)
- R0 f; D5 w. a0 o( S
0 B6 C7 I A w/ u% v! x' M(6) inflateInit() + inflate() + inflateEnd(); Q" r2 k2 T2 o: I
& s& P, n" I8 w6 b和(5)类似,完成解压缩功能.
1 a# G. i/ i$ e7 Z* m * K3 s: V$ H% S3 N1 I( H/ `4 A
(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.) z( j+ @" N4 z H9 L
1 y' B5 a& x9 W) s
(8) 其他诸如获得版本等函数就不说了.
2 v. G8 C t5 M7 s2 C7 E O总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.0 l8 f$ d- ]5 x: ^
2 V6 w Y4 Z+ A+ w* K5 W" ?题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.
6 ]* S5 r& l1 e. V1 i+ M+ K3 f$ m) M
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx
% |- `4 R! E: K5 ` |
|