翻譯自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壓縮過的動態庫有時候會有一些異常問...