1. 下載與安裝
官網地址是:http://www.zlib.net/,目前最新的版本是1.2.11。下載的文件包為zlib-1.2.11.tar.gz
在Linux下解壓,然后在終端中進入其文件夾,之后使用如下命令:
#配置 ./config #編譯 sudo make #安裝 sudo make install #加載配置 ldconfig
就安裝完成了。
2. 如何使用
源文件中加入#include “zlib.h”,編譯選項中加入"-lz",例如:
gcc -o ztest zlibtest.c -lz
如果是使用的VS Code,則在生成的tasks.json中加入-lz即可,如下:
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc build active file", "command": "/usr/bin/gcc", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", "-lz"//這里 ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "compiler: /usr/bin/gcc" } ] }
3. 程序測試
為了便於數據的壓縮和解壓縮,提供了實用函數,包括了compress和uncompress,直接上代碼:
#include <stdio.h> #include "zlib.h" int main() { char strSrc[] = "aaaaaaabbbbbbbbbbbbbbbcccccccccccc"; char buf[1024] = {0}, strDst[1024] = {0}; long srcLen,bufLen,dstLen; srcLen = sizeof(strSrc); bufLen = sizeof(buf); dstLen = sizeof(strDst); printf("zlib Version:\t%s\n", zlibVersion()); printf("Original String Length=%ld\n",srcLen); //compress printf("Compressing...\n"); compress(buf,&bufLen,strSrc,srcLen); printf("Compressed Length:%ld\n", bufLen); printf("Compressed String:%s\n", buf); /uncompress printf("Uncompressing...\n"); uncompress(strDst, &dstLen, buf, bufLen); printf("Uncompressed Length:%ld\n", dstLen); printf("Uncompressed String:%s\n", strDst); return 0; }
運行效果如下:
zlib Version: 1.2.11 Original String Length=35 Compressing... Compressed Length:17 Compressed String:x�KL�$T�� Uncompressing... Uncompressed Length:35 Uncompressed String:aaaaaaabbbbbbbbbbbbbbbcccccccccccc
這里使用了compress和uncompress這兩個函數分別實現壓縮和解壓縮。
函數定義和說明如下:
ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen));
是將源緩沖區的數據壓縮后放入目標緩沖區,其中dest和source分別是目標緩沖區和源緩沖區,sourceLen是源緩沖區中數據的長度(以字節計算),而destLen是目標緩沖區的長度(同樣以字節計算),該處提供時,至少是compressBound(sourceLen),程序返回后,該值就是實際壓縮后的數據長度(以字節計算),所以不放心的時候,可以使用compressBound(sourceLen)的返回值給destLen賦值,上例的代碼中,該過程將返回48(沒想到居然比源數據長度還大),不過這個提供了一個比較好的估計,我們可以在compressBound以后,通過動態內存分配創建目標緩沖區。函數的返回值如下:
Z_OK:函數執行成功
Z_MEM_ERROR:內存不足
Z_BUF_ERROR:目標緩沖區空間不足
另外,還提供了compress2函數,定義差不多:
ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level));
主要是最后多了一個level的壓縮級別,可以是如下幾個值:
#define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1)
compress函數相當於是compress2在壓縮等級為Z_DEFAULT_COMPRESSION時的效果。
解壓函數uncompress定義如下:
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen));
含義與compress類似,此處不再贅述,參考官網手冊,如果是使用compress2壓縮的,則要使用對應的uncompress解壓縮。