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的设置信息,根据传参来决定
0QLZ_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
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 

Overlapping decompression

1.5版本的quicklz支持解压重叠,来节约内存。
假设

d = (decompressed size)  

c = (compressed size).

将压缩数据放在解压缓冲的最右端
 lower addresseshigher addresses 
d + (d >> 3) + 400 – c bytes of spacec 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 bits64 bits

QLZ_COMPRESSION_LEVEL

123123
sizeof(qlz_state_compress)36868348202662443687267592528392
sizeof(qlz_state_decompress)2048434820836872675928

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值