翻譯自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的設定資訊,根據傳參來決定
qlz_compression_level
1
sizeof(qlz_state_compress)
2
sizeof(qlz_state_decompress)
3
qlz_streaming_buffer
6
1 if qlz_memomry_safe is defined, otherwise 0
7
qlz_version_major
8
qlz_version_minor
9
qlz_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()
{
char *destination;
char original[] = “test of overlapping decompression.
five, six, seven, eight, nine, fifteen, sixteen, seventeen, fifteen, sixteen, seventeen.“; int d = strlen(original);
qlz_state_compress *state_compress = (qlz_state_compress *)malloc(sizeof(qlz_state_compress));
qlz_state_decompress *state_decompress = (qlz_state_decompress *)malloc(sizeof(qlz_state_decompress));
char *compressed = (char *)malloc(d + 400); int c = qlz_compress(original, compressed, d, state_compress);
destination = (char *)malloc(d + (d >> 3) + 400);
memmove(destination + d + (d >> 3) + 400 – c, compressed, c);
qlz_decompress(destination + d + (d >> 3) + 400 – c, destination, state_decompress);
destination[d] = 0;
printf(“%s”, destination);
return 0;
}
state結構需要占有的記憶體:
sizeof(char *)
32 bits
64 bits
36868
34820
266244
36872
67592
528392
20484