天天看點

zlib壓縮算法

本文的目的是: 簡單說明如何把zlib加入到MFC程式中,提供記憶體壓縮功能.

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的源代碼時被好多宏吓倒了,呵呵,後來仔細看下去才發現原來接口那麼簡單. 至于那些英文說明也沒想象中的那麼難懂.隻要有嘗試的勇氣,總能有些收獲

繼續閱讀