LZO基本介绍与调试总结

转载自:

https://blog.****.net/qq_27918645/article/details/70336368

一、LZO介绍

LZO 是一个用 ANSI C 语言编写的无损压缩库。他能够提供非常快速的压缩和解压功能。解压并不需要内存的支持。即使使用非常大的压缩比例进行缓慢压缩出的数据,依然能够非常快速的解压。LZO遵循GNU 的GPL 使用许可。

LZO 非常适合进行数据的实时压缩解压处理,这就是说他更关心操作速度,而不是压缩比例。

LZO 使用 ANSI C 语言编写,并且压缩后的数据也被设计为可以跨平台使用的格式。

LZO 拥有如下的特点:

解压速度很快,并且很简单;

解压时不需要内存支持;

压缩的速度还不错;

压缩时只需要 64 KiB 的内存支持;

压缩比例可以根据需要调节,而这并不影响解压的效率,提高压缩比例自然会降低压缩速度;

压缩包含了很多的压缩级别,提供很多选择;

提供只需要 8 KiB 内存支持的压缩级别;

提供线程安全;

提供无损压缩;

参考资料:http://www.oberhumer.com/opensource/lzo/lzofaq.php

                     http://blog.****.net/romainxie/article/details/8228231(译)

二、代码

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

LZO基本介绍与调试总结

通过说明性文件,可以得知:

文件夹B:包含了 DOS、windows 等系统的支持文件

文件夹examples:包含了示例程序代码

文件夹include:包含了公共头文件

文件夹minilzo:包含了LZO算法一种简化版

文件夹src:包含了LZO源码

文件夹util:包含了一些涉及到的脚本

三、编解码器的编写

1、新建工程LZO

2、这里采用的代码原型是simple.c文件,之后添加example文件夹以及src文件夹以及 include文件夹中的相关文件(具体方法是在运行之后根据debug内容添加相关文件)

注:在修改中出现并克服了以下问题

(1)之前一直显示找不到.h文件,因为是新建了工程,所以引入的.h文件不能再使用<>,而应该使用””。

(2)如果.c文件引入的.h文件和其在一个文件里,使用#include”xxx.h” ,如果.h文件在和.c文件同一层的文件夹里,使用#include”xxx/xxx.h” ,如果.h文件和.c文件所在的文件夹是并列的,使用#include”../xxx.h”

3、代码内容

(1)定义变量

(2)lzo库初始化

(3)读取输入输出文件,这里使用文件指针,使用buffer存放读入数据

(4)这里需要得到输入文件的大小,这里采用fseek()以及ftell()函数。

其中,fseek()函数的用法如下:

fseek(fp,10,0);//就是把指针指向fp文件开头10字节处

fseek(fp,10,1);//就是把指针指向fp文件离当前位置10字节处

fseek(fp,10,2);//就是把指针指向fp文件结尾前10字节处

ftell()函数的用法如下:

n=ftell(fp);//n即为偏离文件首字符个数

(5)调用lzo1x_1_compress函数进行压缩,并把数据写入输出文件

(6)调用lzo1x_decompress函数进行解压缩

(7)释放缓冲区关闭文件

4、结果

输入文件是个自己写的input.txt

LZO基本介绍与调试总结

输出文件是压缩后的文件output.txt

LZO基本介绍与调试总结

运行结果如下:

LZO基本介绍与调试总结
从中可以看出1198字节的input.txt被压缩成135字节,后又被解压成1198字节,因为存在很多重复字母以及重复排列顺序,所以压缩量是很可观的。