quicklz 介面函式

2021-09-23 20:04:34 字數 2381 閱讀 4714

翻譯自quicklz c手冊

///壓縮函式:

size_t qlz_compress(

const void *source, 

char *destination, 

size_t size, 

qlz_state_compress *state_compress)

source,源字元位址

destination,壓縮後的資料儲存起始位址,其大小至少為size+400位元組

size,需要壓縮的源字串長度,必須在1到2^32-1之間

qlz_state_compress在quicklz.h中定義,用於壓縮演算法過程中的臨時狀態儲存

注意qlz_state_compress結構體非常龐大,因此不應該在函式區域性定義,以防止產生棧溢位。

解壓函式:

size_t qlz_decompress(

const char *source, 

void *destination, 

qlz_state_decompress *state_decompress)

解壓source並將解壓結果寫入到destination中。

size_t qlz_size_compressed(const char *source)

獲取壓縮資料的大小,

int qlz_get_setting(int settings)

用於獲取quiklz的設定資訊,根據傳參來決定 0

qlz_compression_level

1sizeof(qlz_state_compress)

2sizeof(qlz_state_decompress)

3qlz_streaming_buffer

61 if qlz_memomry_safe is defined, otherwise 0

7qlz_version_major

8qlz_version_minor

9qlz_version_revision 

壓縮級別:

quicklz裡的壓縮級別需要在編譯時確定,不可通過引數來調整

#define qlz_compression_level 1

//#define qlz_compression_level 2

//#define qlz_compression_level 3

預設壓縮級別為1,注意解壓時,也要以相同的壓縮級別來進行解壓。

由於lz壓縮是基於尋找重複字串來進行的,如果資料被分割成多個小的packet(小於10-50kb),每個packet被單獨壓縮,這回降低壓縮比。將qlz_streaming_buffer 設定成乙個非0值,允許開啟streaming模式,這種情況下,quicklz會儲存qlz_streaming_mode個位元組的歷史快取。歷史快取儲存在state結構體中。

#define qlz_streaming_buffer 0

//#define qlz_streaming_buffer 100000

//#define qlz_streaming_buffer 1000000

當使用qlz_streaming_buffer 時,需要注意:

1.packets在解壓時的順序要和壓縮時的順序一樣

2.qlz_compress() 或者 qlz_decompress()的state變數在呼叫時被傳遞

3.state初始化需要置0

同樣的在壓縮和解壓時,都必須使用相同的qlz_streaming_buffer

1.5版本的quicklz支援解壓重疊,來節約記憶體。

假設將壓縮資料放在解壓緩衝的最右端 ←

lower addresses

higher addresses

→ d + (d >> 3) + 400 – c bytes of space

c bytes of compressed data

↑destination

這種情況下,資料解壓到目標位址,可能重寫一部分壓縮資料。

例如如下例子:

#include 「quicklz.h」

int main()

state結構需要占有的記憶體:

sizeof(char *)

32 bits

64 bits

qlz_compression_level12

3123

sizeof(qlz_state_compress)

36868

34820

266244

36872

67592

528392

sizeof(qlz_state_decompress)

20484

34820

836872

675928

Quicklz壓縮演算法

以前對壓縮演算法一無所知,只是知道哈弗曼編碼能做這種事情,但是感覺這樣的方法奇慢無比。昨天下午看了下號稱世界上最快的壓縮演算法quicklz,對壓縮的基本思路有了一定的了解。一般的壓縮程式的要求讀入檔案之後以便壓縮一邊輸出,而不是去先分析整個檔案中的情況之後才做決定採取哪種演算法。quicklz也不...

Quicklz壓縮演算法

以前對壓縮演算法一無所知,只是知道哈弗曼編碼能做這種事情,但是感覺這樣的方法奇慢無比。昨天下午看了下號稱世界上最快的壓縮演算法quicklz,對壓縮的基本思路有了一定的了解。一般的壓縮程式的要求讀入檔案之後以便壓縮一邊輸出,而不是去先分析整個檔案中的情況之後才做決定採取哪種演算法。quicklz也不...

使用quicklz縮小程式體積

目錄將二進位制檔案生成c陣列程式 有乙個需求是這樣的,寫的乙個程式內建了乙個很大的檔案 實際就是抓取epsg.io的內容裡面的epsg.io.json 這個檔案篩選縮減後還有12mb,如果直接內建到程式中,編譯後的程式就很大了。因為這個程式是乙個動態庫,而使用upx壓縮過的動態庫有時候會有一些異常問...