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,包含以下文件夹:
通过说明性文件,可以得知:
文件夹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
输出文件是压缩后的文件output.txt
运行结果如下:
从中可以看出1198字节的input.txt被压缩成135字节,后又被解压成1198字节,因为存在很多重复字母以及重复排列顺序,所以压缩量是很可观的。