常用数据压缩库的编译与使用

嵌入式 136浏览

常用数据压缩库的编译与使用

由于在工作中有用到数据压缩的功能,我便查找了一些压缩函数库,对这些函数库进行了简单的实验,简要对比了各自的性能。在这里,我既是对以前工作的总结,也同时希望能给其他人带来一些帮助。

首先,因为我工作中使用的环境是嵌入式Linux系统,采用的是C语言,因此我在选择压缩函数库的时候主要是选择一些能交叉编译的函数库。我前后共实验了三种函数库,分别是:LZO、ZILB和LZMA。分别在Windows平台和嵌入式Linux平台实验。由于我对压缩算法并没有深入的了解,实验的结果也不能确保一定正确,仅仅为作为一个参考。

1.    数据压缩库简介

1.1  LZO库简介

LZO库在描述自己的时候使用的是“实时数据压缩库”(a real-time data compression library),这就意味着LZO库是更加重视数据压缩的速度。该项目的主页是http://www.oberhumer.com/opensource/lzo/,LZO
遵循 GNU 的 GPL 使用许可。

LZO库最初采用ANSI C编写,是一个无损压缩库。它提供多个压缩函数接口,要得到高的压缩率,就会降低压缩速度,然而,解高压缩率的数据并没有明显速度。详细的说明可以参考其工程目录下的doc/LZO.TXT文件,这里简单列出该压缩库的一些特点:

1、解压速度非常快,解压不需要额外的内存空间。

2、压缩速度也非常快,压缩只需要64k的内存。

3、提供函数接口用来牺牲速度来换取高压缩率,但解压速度不降低。

4、有仅仅需要8k内存的压缩算法。

5、算法是线程安全的无损压缩算法。

1.2    ZLIB库简介

ZLIB库是一个通用的数据压缩库,它几乎已经成为了一个业界的标准,在许多软件中得到应用。该项目的主页是http://www.zlib.net/ZLIB是自由软件,使用ZLIB授权。

ZLIB数据压缩库同样是一个无损压缩库,对线程也是安全的。它提供数据压缩接口,同时也提供了gzip文件的读写接口。函数库提供了对处理器和内存使用控制的能力,可以在诸如嵌入式系统这样内存有限制的环境中是有用的。详细的说明可以参考其工程目录下doc目录中的文档。

1.3    LZMA库简介

LZMA是一个Deflate和LZ77算法改良和优化后的压缩算法库,具有很高的压缩比。2001年被首次应用于7-Zip压缩工具中,是 2001年以来得到发展的一个数据压缩算法。项目主页为http://www.7-zip.org/sdk.htmlLZMA是公开的压缩库。

LZMA库具有高的压缩比和较快的速度,解压代码和占用的内存都比较小。其压缩所需要的内存是:字典大小*11.5+6M+状态大小。解压需要的内存是:字典大小+状态大小。详细的说明可以参考其工程目录下doc目录中的文档。

2 数据压缩库的编译方法

由于我要测试Windows平台和嵌入式Linux平台下的运行情况,因此这里只是列举这两个平台的编译方法。编译的目标是静态库,这里列举的方法可能不是最简单的编译方法,如果你有更加方便或规范的编译方法请与我联系。

2.1  LZO库的编译

    我使用的LZO库的版本是2.09

  • Windows平台编译

在LZO工程文件中目录B/win32和B/win64目录中有编译的批处理文件,可是我在实际使用的过程中不能正确执行,不知道是不是哪里出了问题,我使用的方法是新建立一个VS工程,包含工程目录下的src和include目录生成静态库文件,最终编译出了LZO的Windows静态库。

  • 交叉编译

LZO的交叉编译时非常简单的,只要进入LZO的目录,依次输入一下命令就可以完成LZO的交叉编译。

1、设置编译器:  export  CC=你的编译器。

2、设置AR程序:export  AR=你的AR程序。

3、设置安装目录./configure --host=arm-linux --prefix=$PWD/amr_install/

4、执行make命令。

5、执行make install命令。

        在这些命令都执行完成之后,LZO的静态库和头文件就会放在工程目录的amr_install文件夹中。在执行make install可能会出现错误,我在执行过程中就出现了chmod无法更改权限的错误,可能是因为我使用虚拟机编译的原因,不过无所谓,自己复制一下就好啦。

2.2  ZLIB库的编译

我使用的ZLIB库版本是1.2.8

a)       Windows平台下编译

ZLIB的Windows下编译很简单,在ZLIB的工程目录下contrib/vstudio/目录中有vc9、vc10、vc11三个文件夹。分别对应不同的VS版本,我安装的是VS2013可以打开vc11。其中的zlibstat工程是用来编译静态库的,只需选中工程点击生成即可。另外,在ZLIB静态库使用的过程中可能会出现函数找不到实现这样的情况,出现这个问题的原因很可能是__stdcall调用和__cdecl调用的问题。解决方法是讲zconf.h中的

#    defineZEXPORTWINAPI

改为:

#    defineZEXPORTWINAPIV

然后重新编译静态库即可。

b)       交叉编译

ZLIB的交叉编译与LZO类似,依次执行以下几条命令即可:

1、设置编译器:  export  CC=你的编译器。

2、设置AR程序:export  AR=你的AR程序。

3、设置安装目录  ./configure--prefix=$PWD/amr_install/

4、执行make命令。

5、执行make install命令。

在这些命令都执行完成之后,ZLIB的静态库和头文件就会放在工程目录的amr_install文件夹中。在执行make命令时也可能会出现chmod无法更改权限的错误,可能是因为我使用虚拟机编译的原因。我最后就只执行了make libz.a命令然后自己动手复制的。

2.3  LZMA库的编译

我使用的LZMA库的版本是15.06 beta。

a)       Windows平台下编译

关于LZMA库的编译,我查了一些资料,都不能实际操作成功,于是我采用了最笨的方法,将工程目录下C文件夹下的所有头文件和C文件全部复制出来,在VS中新建一个静态库工程,编译出静态库。

b)       交叉编译

交叉编译我同样不能找到一个我能成功执行的方法,也是采用了复制所有的头文件和C文件,编写makefile。然而并没有那么顺利,编译过程中出现了许多的错误。我试图解决这些错误,发现大部分还是平台的原因。应该是还有哪些宏开关没有配置或修改,由于时间的原因,就没有深入研究,以后有时间在来解决这个问题吧。

3 数据压缩库的简单使用

3.1  LZO库的使用

LZO库提供一系列的数据压缩函数,不同的压缩函数代表着不同的压缩方法或不同的压缩等级,当然具有不同的压缩比和压缩时间。不同等级的压缩函数往往使用相同的解压函数进行解压。具体的数据压缩函数和压缩等级可以参考/doc/LZO.TXT中给出的表格(见下图)。简单的测试代码在examples/ simple.c文件中。

LZO压缩函数一般有5个参数:

1、输入数据缓存指针。

2、输入数据长度。

3、输出数据缓存指针。

4、输出缓存区长度指针、压缩后的数据长度(传入输出缓存区长度,输出压缩后的数据长度)。

5、压缩过程额外需要的内存指针(在对应的头文件有定义)。

LZO解压函数一般也有5个参数:

1.       输入数据缓存指针。

2.       输入数据长度。

3.       输出数据缓存指针。

4.       输出缓存区长度指针、解压后的数据长度(传入输出缓存区长度,输出解压后的数据长度)。

5.       解压过程额外需要的内存指针(没有用,一般传入null)

3.2 ZLIB库的使用

ZLIB提供的压缩函数主要是compress和compress2,其中compress是compress2设置压缩等级为默认值(默认值为6)的情况。解压函数是uncompress。其用法也是十分简单,和LZO基本一样。只是前两个参数是输出相关的中间两个参数是输入相关的,最后一个是压缩等级。解压函数只有四个参数。简单的测试用例参考test/ example.c。

3.3 LZMA库的使用

对于LZMA库可以使用LzmaCompress进行数据压缩,使用LzmaUncompress进行数据解压。其中压缩函数的参数列表比较复杂有13个参数,解压函数有6个参数。

首先,先看一下压缩函数的参数:

1~4:输入输出数据相关的参数。

5~6:prop变量相关的参数,至于prop可以理解为压缩所产生的附加信息,后面解压的时候需要用到sizeProp必须为5。

7: level 压缩等级0 <= level <= 9, default = 5。

8: dictSize 字典大小 default = (1 <<24) 就是2^24bit

其他在lzmalib.h中有详细的说明,用户可以参考

解压函数就比较简单了,输出输入和prop变量。这里的prop必须是压缩函数输出的变量。

4 数据压缩库的实验结果



Windows下的实验结果:(2.36GHz双核CPU,2G内存)



AMR下实验结果:(AMR9  9G25芯片)