天天看點

quicklz 接口函數

翻譯自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