zlib應用


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解壓縮。

 


免責聲明!

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



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