LZO--实时数据压缩库

来源:互联网 发布:遗传算法岛屿模型 编辑:程序博客网 时间:2024/06/01 09:56

首先从网址https://www.oberhumer.com/opensource/lzo/下载LZO源代码,解压缩后的文件:lzo-2.10


一、介绍


doc/LZO.TXT--对LZO的介绍,doc/LZO.FAQ--各种花絮信息,NEWS--当前的更新版本较于之前的一些主要变化,

INSTALL--编译安装说明,autoconf--autoconf的配置文件,B--支持各种系统的文件,example--示例程序,包括公共的

头文件,minilzo--LZO库一个很小的子集,src--库源,tests--或多或少异乎寻常的测试程序,util--脚本。

LZO是一个便携式的无损数据压缩库,它的压缩和解压缩速度都很快,解压不需要内存允许在压缩部分以损失压缩速度为代价提高压缩率解压速度不会降低,适合实时压缩解压缩,支持重复压缩以及原地解压,LZO是块压缩算法——压缩解压成块的数据,压缩与解压所用块的大小必须一样,而且它的源码和压缩数据可以跨平台移植。LZOxx-N 定义了使用的算法名称,N代表压缩级别:1-9 级别使用 64 KiB(1KiB=2^10=1024B)内存,提供更快的压缩速度,99 级别使用 256 KiB 内存,提供更大的压缩比例,但是处理速度依然很快,999 级别是按照压缩比例优化的算法,压缩速度很慢,并且使用大量的内存,这种级别一般用于生成预压缩数据。LZO1B适合处理大量的数据,或者有高冗余性的数据;LZO1F适合处理小量数据和二进制数据;LZO1X适合各种环境;LZO1Y 和 LZO1Z 跟 LZO1X 很相像,它们能够在一些环境中达到更好的压缩比例。压缩以后的数据长度:对于算法 LZO1,LZO1A,LZO1B,LZO1C,LZO1F,LZO1X,LZO1Y,LZO1Z,output_block_size = input_block_size + (input_block_size / 16) + 64 + 3;对于算法LZO2A,output_block_size = input_block_size + (input_block_size / 8) + 128 + 3 

假设用LZO1X-1来压缩数据:1. 压缩 #include <lzo/lzo1x.h>,调用lzo_init(),用lzo1x_1_compress()来压缩,编译连

接 LZO 库,2. 解压缩 #include <lzo/lzo1x.h>,调用lzo_init(),用lzo1x_decompress()来解缩,编译连接 LZO 库 


二、代码


Usage : lzotest [option..] file..

基础参数:-m# 压缩方法

  -b#  设置输入块大小[默认为262144,最大为1310720]

  -n#  压缩/解压缩进程运行数目

  -c#  压缩进程运行数目

  -n#  解压缩进程运行数目

  -S    使用安全解压(如果有需要的话

  -@   读入待压缩的列表


我只根据simple.c实现了最简单的压缩及解压缩功能(我的运行环境是vs2013)

  • 压缩
1. 首先建立一个LZO-Compress工程,将simple.c中的代码复制粘贴到LZO-Compress.cpp中,在不知道多余信息的情           况下先运行工程,根据报错一一解决。
2. #include <lzo/lzoconf.h>:无法打开包括文件,在LZO-Compress.cpp目录下,新建文件夹lzo,将头文件                           lzoconf.h和lzo1x.h拷贝进去,在解决方案头文件处添加这两个文件,运行之后,这句依旧报错,将其改成
    #include "lzo/lzoconf.h" 错误解决。#include "examples/portab.h"以及#include <lzo/lzodefs.h>也是同样的解决方式。
3. 许多函数以及标识符报错,这是因为没有将库源src文件夹添加进来,将文件夹src拷贝到LZO-Compress.cpp目录           下,将其中公共头文件、源文件以及关于算法lzo1x的头文件、源文件都添加进解决方案。
4. Debug\*.pch预编译头文件来自编译器的早期版本或者预编译头为 C++ 而在 C 中使用它(或相反):该错误是因为当前     项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不             同),因而不能共用一个预编译头文件。解决方法:项目-->属性-->C/C++ 预编译头--> 创建使用头文件:不使用预     编译头文件。
    运行之后,没有错误,开始按压缩流程添加代码。
1. 首先在项目-->属性-->配置属性-->调试-->命令参数中填写输入文件名(待压缩文件),输出文件名(压缩后文件)
2. 首先需要定义两个文件指针,输入和输出文件指针,第一步:初始化LZO数据库,第二步:为文件指针赋值,并为     其各自的buffer开辟空间,输入buffer开辟空间的大小取决于输入文件大小,所以要定义一个能得到文件大小的函数     getFileSize( ),我用的输入文件是一个txt格式文件,文本内容为上课时的例子: wabba wabba wabba wabba woo woo     woo输出文件长度由第一部分介绍可知计算公式
3. 将输入文件中的内容读入输入buffer
4. 通过函数 lzo1x_1_compress( )对输入buffer中的内容实现压缩,压缩后的编码存入输出buffer,最后将输出buffer中的     内容写入输出文件,如下图:

图1. UltraEdit显示输出文件
  • 解压缩
步骤与压缩相同,只是通过函数lzo1x_decompress( )实现对输出文件内容的解压缩,解压缩后的txt文件中内容如下图:

图2. UltraEdit显示解压缩后文件

0 0
原创粉丝点击