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

0 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 

Overlapping decompression

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

假设

d = (decompressed size)  

c = (compressed size).

将压缩数据放在解压缓冲的最右端

← 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

QLZ_COMPRESSION_LEVEL

1 2 3 1 2 3
sizeof(qlz_state_compress) 36868 34820 266244 36872 67592 528392
sizeof(qlz_state_decompress) 20484 34820 8 36872 67592 8
时间: 2025-01-02 17:28:44

quicklz 接口函数的相关文章

magento -- 关于更新订单状态的API接口函数

做Magento和其他系统的对接时需要调用Magento的Api,原以为更新一个订单的状态这样的函数Magento默认肯定自带有,一开始却找不到,打开官网看order部分提供的接口函数列表也没找到.   按说明,从上到下依次为批量获取订单,获取单个订单,给订单添加备注,锁定订单,解锁订单和取消订单.在我认为不存在这个函数准备自己写一个的时候,看代码发现其实addComment这个函数已经提供了更新订单状态的功能,而不仅仅是添加备注,看代码 public function addComment($

js与flash的操作接口函数

js与flash的操作接口函数 作者:yemoo -------------------------------------------------------------------------------- 可控制Flash Player的Javascript方法一览表: Play() ---------------------------------------- 播放动画 StopPlay()------------------------------------停止动画 IsPlayi

数据-图像通过显卡传输到另外一个显示器的接口函数

问题描述 图像通过显卡传输到另外一个显示器的接口函数 我想实现上位机加载图片后,点击按钮下发,通过接口函数将图片的数据输入到显卡上,显卡外接另一个显示器,将输入的图片数据流显示在外接显示器上,这里图片下发到显卡的接口函数是什么??听说是DirectX,也不知道对不对,c++如何去编写 解决方案 这个需要你的显卡支持,双头显卡可以同时接两个显示器,在两个显示器上同时显示 解决方案二: 上位机下发图片的接口函数是什么?

鼠标hook函数中如何调用COM接口函数?

问题描述 请问大家鼠标HOOK函数中不能直接调用COM接口函数??下面是我的一个hook例子:///<summary>///鼠标钩子///</summary>privateMouseHookmouseHook;//设置鼠标钩子mouseHook=newMouseHook();mouseHook.MouseClick+=newMouseEventHandler(mouseHook_MouseClick);mouseHook.StartHook(HookType.WH_MOUSE_LL

CButtonST类公共接口函数

以下是CButtonST类的所有公共成员函数(函数名按音序排列先后): CButtonST::DrawBorder DWORD DrawBorder(BOOL bDrawBorder = TRUE, BOOL bRepaint = TRUE) 注释: 因为CButtonST的默认显示风格是平面按钮.调用此函数用来显示按钮边框. 参数: bDrawBorder: 值为TRUE则显示按钮边框. bRepaint: 值为TRUE则马上重绘按钮. 返回值: BTNST_OK: 函数执行完毕. CButt

android版sdk,调用登录接口函数之后不进回调(如onSuccess,或onError),也捕捉不到异常。

问题描述 问题描述:用环信sdk (android版),可以正确初始化,也可以成功的注册,第一次运行注册用户成功,以后注册都可以捕到用户已存在的异党,但是调用注册接口时,无法进入任何回调,也捕不到任何异常.不知道登录的结果是什么. 我调用SDK的过程是这样的:1. 初始化:EMChat.getInstance().init(getApplicationContext());EMChat.getInstance().setDebugMode(true);2.注册与登录try  {         

Visual Studio 2010/2013 查看DLL接口(函数)

1. "应用程序" Visual Studio 2010/2013 的Visual Studio Tools文件夹中打开Visual Studio Command Prompt 命令提示窗口 2. dumpbin /exports c:\...\**.dll     (文件完整路径)

函数式接口、默认方法、纯函数、函数的副作用、高阶函数、可变的和不可变的、函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分

本文讲的是函数式接口.默认方法.纯函数.函数的副作用.高阶函数.可变的和不可变的.函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分, 太棒了,我们又来到新的一天.这一次,我们要学一些新的东西让今天变得有意思起来. 大家好,希望你们都过得不错.这是我们的 RxJava2 Android 系列的第三篇文章. 第一部分 第二部分 在这篇文章中,我们将讨论函数式的接口,函数式编程,Lambda 表达式以及与 Java 8 的相关的其它内容.这

linux内核中的排序接口--sort函数

linux内核中的sort函数,其实跟我们所说的qsort函数很像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 参数:  1 .待排序数组首地址 2 .数组中待排序元素数量 3 .各元素的占用空间大小 4 .指向函数的指针,用于确定排序的顺序. 其中compare函数应写为: 1 2 3 4 int com