zlib壓縮數據


zlib是用於數據壓縮的函數庫,使用DEFLATE算法。最初是為libpng函數庫開發,后來普遍為許多軟件所使用。zlib為自由軟件。

DEFLATE是同時使用了LZ77算法與哈夫曼編碼(Huffman Coding)的一個無損數據壓縮算法。

zlib在業界應用廣泛,包括:

Linux kernel:使用zlib實作網絡協定的壓縮、檔案系統的壓縮以及開機時解壓縮內核。

libpng,用於PNG圖形格式的一個實現,對bitmap數據規定了DEFLATE作為流壓縮方法。

Apache:使用zlib實作http 1.1。

OpenSSH、OpenSSL:以zlib達到最佳化加密網絡傳輸。

FFmpeg:以zlib讀寫Matroska等以DEFLATE算法壓縮的多媒體串流格式。

rsync:以zlib最佳化遠端同步時的傳輸。

SVN、Git和 CVS,使用zlib來壓縮和遠端倉庫的通訊流量。

dpkg和RPM等包管理軟件:以zlib解壓縮RPM或者其他封包。

因其代碼的可移植性,寬松的許可以及較小的內存占用,zlib在許多嵌入式設備中也有應用。

從zlib官網(http://zlib.net/)上可以下載到源碼和庫,zlib.h中聲明了可以用的庫函數,主要函數如下:

(1) int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

將源緩沖中的數據壓縮並放入目的緩沖區。destLen作為入口參數時,指明目的緩沖區的字節大小。目的緩沖區至少要比源緩沖大小(sourceLen)加12個字節之后還大上0.1%。destLen作為出口參數時,指明壓縮之后的數據所占的字節大小。

compress返回Z_OK表示成功;返回Z_MEM_ERROR表示沒有足夠內存;返回Z_BUF_ERROR表示目的緩沖區不夠大。

(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);

功能和compress函數一樣,只多出一個參數level。level可以設置為Z_DEFAULT_COMPRESSION,或者0到9之間的數。設置為1,代表要求最高的壓縮速度;設置為9,代表要求最高的壓縮率;設置為0,表示不壓縮;設置為Z_DEFAULT_COMPRESSION,表示要求一個適中的壓縮速度和壓縮率。

compress2的返回值也和compress基本相同,只多出一個Z_STREAM_ERROR,代表level參數無效。

(3) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);

將源緩沖中的數據解壓縮並放入目的緩沖區。參數和compress類似。返回值也和compress基本相同,多出一個Z_DATA_ERROR,代表輸入數據被破壞。

(4) deflateInit() + deflate() + deflateEnd()

3個函數結合使用完成壓縮功能,具體用法參照example.c 的 test_deflate()函數。其實 compress() 函數內部就是用這3個函數來實現的(見工程的compress.c 文件)。

(5) inflateInit() + inflate() + inflateEnd()

和(4)類似,完成解壓縮功能。

(6) gz開頭的函數,用來操作*.gz文件。和文件stdio調用方式類似,用法參照example.c的 test_gzio()函數。

在我現在的項目中,使用zlib的目的主要是壓縮和平台服務器端的通訊數據流量。我只用到了compress和uncompress函數,使用很方便。

上傳了一份動態庫,是zlib for wince的版本,有需要下載的可以點這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM