1. 如何獲得zlib
zlib的主頁(yè)是:http://www.zlib.net/
2. 用VC++6.0打開
把 下載的源代碼解壓打開,VC6.0的工程已經(jīng)建好了,在\projects\visualc6. 雙擊zlib.dsw, 可以在VC++6.0中看到里面有3個(gè)工程: zlib 是庫(kù)文件(編譯設(shè)置選中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函數(shù)讀寫.gz文件的示例(*.gz的文件一般Linux下比較常用).
3. 如何加入到我的工程
編譯好 zlib.lib 后, 你就得到了調(diào)用一個(gè)靜態(tài)庫(kù)所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何調(diào)用靜態(tài)庫(kù)不用我說了吧.
4. 用zlib能干什么
先來看看 zlib 都提供了那些函數(shù), 都在zlib.h中,看到一堆宏不要暈,其實(shí)都是為了兼容各種編譯器和一些類型定義.死死抓住那些主要的函數(shù)的原型聲明就不會(huì)受到這些東西的影響了.
關(guān)鍵的函數(shù)有那么幾個(gè):
(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
把源緩沖壓縮成目的緩沖, 就那么簡(jiǎn)單, 一個(gè)函數(shù)搞定
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
功能和上一個(gè)函數(shù)一樣,都一個(gè)參數(shù)可以指定壓縮質(zhì)量和壓縮數(shù)度之間的關(guān)系(0-9)不敢肯定這個(gè)參數(shù)的話不用太在意它,明白一個(gè)道理就好了: 要想得到高的壓縮比就要多花時(shí)間
(3) uLong compressBound (uLong sourceLen);
計(jì)算需要的緩沖區(qū)長(zhǎng)度. 假設(shè)你在壓縮之前就想知道你的產(chǎn)度為 sourcelen 的數(shù)據(jù)壓縮后有多大, 可調(diào)用這個(gè)函數(shù)計(jì)算一下,這個(gè)函數(shù)并不能得到精確的結(jié)果,但是它可以保證實(shí)際輸出長(zhǎng)度肯定小于它計(jì)算出來的長(zhǎng)度
(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
解壓縮(看名字就知道了:)
(5) deflateInit() + deflate() + deflateEnd()
3個(gè)函數(shù)結(jié)合使用完成壓縮功能,具體用法看 example.c 的 test_deflate()函數(shù). 其實(shí) compress() 函數(shù)內(nèi)部就是用這3個(gè)函數(shù)實(shí)現(xiàn)的(工程 zlib 的 compress.c 文件)
(6) inflateInit() + inflate() + inflateEnd()
和(5)類似,完成解壓縮功能.
(7) gz開頭的函數(shù). 用來操作*.gz的文件,和文件stdio調(diào)用方式類似. 想知道怎么用的話看example.c 的 test_gzio() 函數(shù),很easy.
(8) 其他諸如獲得版本等函數(shù)就不說了.
總結(jié): 其實(shí)只要有了compress() 和uncompress() 兩個(gè)函數(shù),在大多數(shù)應(yīng)用中就足夠了.
題外話: 我最初看到zlib的源代碼時(shí)被好多宏嚇倒了,呵呵,后來仔細(xì)看下去才發(fā)現(xiàn)原來接口那么簡(jiǎn)單. 至于那些英文說明也沒想象中的那么難懂.只要有嘗試的勇氣,總能有些收獲.
#include <iostream>
#include <stdlib.h>
#include "zlib.h"

using namespace std;

#define MaxBufferSize 1024*10

void main()

...{
int i;

FILE* File_src;
FILE* File_tmp;
FILE* File_dest;

unsigned long len_src;
unsigned long len_tmp;
unsigned long len_dest;

unsigned char *buffer_src = new unsigned char[MaxBufferSize];
unsigned char *buffer_tmp = new unsigned char[MaxBufferSize];
unsigned char *buffer_dest = new unsigned char[MaxBufferSize];

File_src = fopen("src.txt","r");
len_src = fread(buffer_src,sizeof(char),MaxBufferSize-1,File_src);

for(i = 0 ; i < len_src ; ++i)

...{
cout<<buffer_src[i];
}
cout<<endl;
compress(buffer_tmp,&len_tmp,buffer_src,len_src);

File_tmp = fopen("tmp.txt","w");
fwrite(buffer_tmp,sizeof(char),len_tmp,File_tmp);

for(i = 0 ; i < len_tmp ; ++i)

...{
cout<<buffer_tmp[i];
}
cout<<endl;

uncompress(buffer_dest,&len_dest,buffer_tmp,len_tmp);

File_tmp = fopen("tmp.txt","r");
File_dest = fopen("dest.txt","w");
fwrite(buffer_dest,sizeof(char),len_dest,File_dest);

for(i = 0 ; i < len_dest ; ++i)

...{
cout<<buffer_dest[i];
}
cout<<endl;

}
Write to file :
char * pchData = "xxx..." ;
gzFile fData = gzopen(pchFile,"wb");
gzwrite(fData,pchData,strlen(pchData));
gzclose(fData);
read from file :
char pchData[1024];
gzFile fData = gzopen(pchFile,"rb");
int n = gzread(fData,pchData,1024);
gzclose(fData);