|
|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能.7 P( s. i+ V6 a, Y: N
$ c u# t3 ^9 ^6 D2 D& R! {9 c7 b
1. 如何获得zlib
( i# i" S' K: J
0 N. n- \/ ]0 Q6 h% C) q" Fzlib的主页是:http://www.zlib.net/
+ k( g* d( Z+ ?1 k0 B) O
# [0 y3 m" O8 @( x j$ r2. 用VC++6.0打开
a7 S; O; y1 J5 a4 K4 V0 C) c7 h 2 k3 Q4 T# Z- z3 U8 r
把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).
6 {+ B8 p0 A) h( n& N! L: y: w0 ]+ O
, s: b+ Y. Y S" {3. 如何加入到我的工程
4 ?$ x6 J+ _ m. B 4 r d0 ?0 W# { o- L% H% v: B
编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧.+ P0 R; l; u9 J
; Z0 |" h' C: Y$ X# N8 p8 _
4. 用zlib能干什么" m# r0 N6 x3 t
, z+ j3 e# B, k先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.
6 V4 W) [* D0 ^% W - w2 @# ^9 G3 P* x
关键的函数有那么几个:
8 B4 p J% ?( f" |. Q" u
7 |6 X% s9 R; z(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
& V( W4 i5 C7 |; b ! w7 P) I! `; [0 S4 ]
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定1 I2 f* G) _3 _+ ?0 T- b/ q0 v/ K9 p% h
; u- i$ r- C3 B o8 b(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
5 u* X" `7 B) }% x ; T1 z4 X, a. H+ i$ Y' Q9 ?; P* J+ D* L
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间/ `5 ~2 U( ?% x6 {7 N6 Z0 r
' P! s4 Y$ O( G! b6 H(3) uLong compressBound (uLong sourceLen);
- v/ x5 @# p& W& G& v! D5 b * b. u; E+ ~( Q+ N6 E9 B
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度* P( ^5 n1 C2 H$ g, C- c/ k
" N$ X; b' {0 B
(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
) E3 l9 i3 Q1 B! C0 j. l . }2 z. E0 _# D1 [/ a1 q: O6 q5 f
解压缩(看名字就知道了:)
+ }# W9 \1 W7 Z/ `" \$ n# b 8 ^) d' _: p" W# ^
(5) deflateInit() + deflate() + deflateEnd()
& [: K+ y C5 ]4 ~8 I
+ n* k; L6 X" t5 H" p W+ j3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)+ E% }9 _0 ]' B% R q3 D6 B
x2 E6 ~' w# o
(6) inflateInit() + inflate() + inflateEnd()) B/ K8 l1 _) B7 S) l- {4 X- i
; n* Q L/ f+ M- n0 r和(5)类似,完成解压缩功能.
3 d0 M$ H) P! H! P3 o$ T
$ P7 N+ S4 f* ^, \* w' K, P(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.# i1 `+ t5 ^7 Y# M" N( s0 o2 P
$ h; q) A( m5 T& Z* N# u8 p(8) 其他诸如获得版本等函数就不说了.
; b/ F h8 H- O9 D. n总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.$ S( X- Y: l+ _. _/ @/ l& N1 E$ O
6 b) z3 d9 e/ l9 [: A题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.$ _* W5 m1 o' e( g0 t9 [. z; p# w
. D6 z! k% {- e3 Q: I6 N本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx
5 ~% V$ C8 u# R; \! L; I: C |
|