|
|
本文的目的是: 简单说明如何把zlib加入到MFC程序中,提供内存压缩功能.+ T5 Z+ Y2 D; ?9 g; S8 I6 ^
* c8 J; a) V2 @7 G
1. 如何获得zlib: G" q7 e% I: _+ M# m$ e8 i
/ y6 [) R- G; y: e$ |zlib的主页是:http://www.zlib.net/6 M$ C9 [- r4 C
7 R) d: W5 g$ v0 F3 U [3 B
2. 用VC++6.0打开
+ s7 q+ f( Q% {/ c1 U0 {
, B. J* b k- |8 ]( M把下载的源代码解压打开,VC6.0的工程已经建好了,在\projects\visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).4 d8 G' n j- x: ?& n4 T& X/ r# y
" H) {; \& T7 e# y1 n$ X3. 如何加入到我的工程
5 f$ f# i) n$ M' k 4 q7 s; s- {$ k7 j
编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧. s- D% l& j: O2 I! r3 w5 i' h1 E
$ T4 U& _# d& s/ B
4. 用zlib能干什么: Q/ K2 p, e" c' c1 j, f1 Z
% _0 [. E& y: m4 |" U$ o6 V9 |先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.2 M0 J; e1 k! O
3 ]) R1 b* b" r# Q; n关键的函数有那么几个:3 x: o. G' H4 N; T( Z) Z8 I9 C
1 z1 L4 B8 t6 [7 F(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); I' o/ X: I% J7 D8 W3 q
L9 A! @8 ~. W" D& l8 G
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定' D" G% N" X( \# M0 t+ X0 G
5 H5 z9 a4 [7 d& z7 i0 z" w M* m( @(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
; m( D# ^5 X) g# C# N' e , g2 r3 x: z' L
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间& [ G5 o2 X2 j% p Q
! e8 d4 V9 X# o3 A
(3) uLong compressBound (uLong sourceLen);
4 Z' ?) q5 q/ ?# _$ G( v5 ?9 [% I c! |8 P9 R1 D' L: H3 S5 v) h
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度
( A1 D; h" \' q
5 [( B+ V' H( T; ?2 h$ \* e(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);: q. g4 q" D3 p) X3 t+ S
2 u& A G* t6 {/ H! q4 e$ B+ {7 X解压缩(看名字就知道了:)
% V. U$ s8 {0 H: e# z* Z. P
8 z/ L+ t) d5 @! H: A(5) deflateInit() + deflate() + deflateEnd()7 C5 \0 D6 B; E. q
: T$ P! S! y) ^" J3 z, O3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)
8 z& W+ V" _ S9 K( B! Z& a
2 Y/ K" g5 V" [' L; k: U! x4 v6 M- G(6) inflateInit() + inflate() + inflateEnd()5 o/ u$ D/ N# X# R1 ^$ N
) P ]3 C! T" O4 t [
和(5)类似,完成解压缩功能.
- M! x8 w' Q' W5 {
' A& k! L! a6 N4 u1 T' V(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy. l5 X7 ^) O& N h1 ? }. ?' V W
7 |$ |: E+ b) K9 {( `6 i9 o
(8) 其他诸如获得版本等函数就不说了.
1 j& I! P' w4 H总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.
* c2 @, @: s9 p2 {1 ~+ b" n
7 R6 h6 n% D1 q3 p题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.
2 \1 o* {) \6 r" N2 A: I- F. W! U/ o; E9 s
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/querw/archive/2006/12/21/1452041.aspx
% H1 y, S' S- Q% X |
|