1. 如何獲得zlib zlib的主頁是:http://www.zlib.net/ 2. 用VC++6.0打開 把 下載的源代碼解壓打開,VC6.0的工程已經建好了,在/projects/visualc6. 雙擊zlib.dsw, 可以在VC++6.0中看到裏面有3個工程: zlib 是庫文件(編譯設置選中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函數讀寫.gz文件的示例(*.gz的文件一般Linux下比較常用). 3. 如何加入到我的工程 編譯好 zlib.lib 後, 你就得到了調用一個靜態庫所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何調用靜態庫不用我說了吧. 4. 用zlib能幹什麼 先來看看 zlib 都提供了那些函數, 都在zlib.h中,看到一堆宏不要暈,其實都是爲了兼容各種編譯器和一些類型定義.死死抓住那些主要的函數的原型聲明就不會受到這些東西的影響了. 關鍵的函數有那麼幾個: (1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); 把源緩衝壓縮成目的緩衝, 就那麼簡單, 一個函數搞定 (2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level); 功能和上一個函數一樣,都一個參數可以指定壓縮質量和壓縮數度之間的關係(0-9)不敢肯定這個參數的話不用太在意它,明白一個道理就好了: 要想得到高的壓縮比就要多花時間 (3) uLong compressBound (uLong sourceLen); 計算需要的緩衝區長度. 假設你在壓縮之前就想知道你的產度爲 sourcelen 的數據壓縮後有多大, 可調用這個函數計算一下,這個函數並不能得到精確的結果,但是它可以保證實際輸出長度肯定小於它計算出來的長度 (4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen); 解壓縮(看名字就知道了:) (5) deflateInit() + deflate() + deflateEnd() 3個函數結合使用完成壓縮功能,具體用法看 example.c 的 test_deflate()函數. 其實 compress() 函數內部就是用這3個函數實現的(工程 zlib 的 compress.c 文件) (6) inflateInit() + inflate() + inflateEnd() 和(5)類似,完成解壓縮功能. (7) gz開頭的函數. 用來操作*.gz的文件,和文件stdio調用方式類似. 想知道怎麼用的話看example.c 的 test_gzio() 函數,很easy. (8) 其他諸如獲得版本等函數就不說了. 總結: 其實只要有了compress() 和uncompress() 兩個函數,在大多數應用中就足夠了. 題外話: 我最初看到zlib的源代碼時被好多宏嚇倒了,呵呵,後來仔細看下去才發現原來接口那麼簡單. 至於那些英文說明也沒想象中的那麼難懂.只要有嘗試的勇氣,總能有些收穫.
#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; } |
zlib用法簡單說明
zlib用法簡單說明
2008年06月04日 星期三 14:13
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.