Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2405081
  • 博文数量: 862
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10598
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(862)

文章存档

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: 系统运维

2011-05-24 09:55:44

转载:http://blog.csdn.net/yui/archive/2010/07/01/5707842.aspx

libz提供了一套与gzip有关的APIlibbz2提供了一套与bzip2有关的API。我们可以利用其中几个常用的函数,在自己的项目中实现压缩、解压缩功能。这两个库文件一般在linux系统中都会有,如果没有,可以分别到以下网址下载其源代码:

 

gzip:

bzip2:

 

libz最有用的函数有四个:

 

gzFile gzopen(const char *path, const char *mode);

int gzclose(gzFile file);

int gzread(gzFile file, void *buf, unsigned len);

int gzwrite(gzFile file, const void *buf, unsigned len);

 

追踪其源代码的话,可以发现,gzFile也就是void *

 

libbz2最有用的函数也有四个:

 

BZFILE *BZ2_bzopen(const char *path, const char *mode);

void BZ2_bzclose(BZFILE *file);

int BZ2_bzread(BZFILE *file, void *buf, int len);

int BZ2_bzwrite(BZFILE *file, void *buf, int len);

 

追踪其源代码的话,可以发现,BZFILE也就是void

 

所以说,libz的四个函数与libbz2的四个函数,无论从名字上看,还是从参数上看,都是如出一辙的。只不过,gzopen()gzread()可以打开和读取任何文件,而BZ2_bzopen()BZ2_bzread()只能打开和读取bzip2压缩的文件。

 

事实上,它们与普通文件的打开、关闭、读取、写入的四个函数,基本上是对应的:

 

FILE *fopen(const char *path, const char *mode);

int fclose(FILE *fp);

int fread(void *buf, int size_of_element, int len, FILE *fp);

int fwrite(void *buf, int size_of_element, int len, FILE *fp);

 

要打开一个打算读取的二进制文件,三个打开函数的调用分别是:

gzopen("filename", "r");

BZ2_bzopen("filename", "r");

fopen("filename", "rb");

 

要打开一个打算写入的二进制文件,三个打开函数的调用分别是:

gzopen("filename", "w");

BZ2_bzopen("filename", "w");

fopen("filename", "w");

 

可以说参数的使用是基本一样的,不过gzopen()BZ2_bzopen()mode参数一般没有"rb"而只有"r",因为它们处理的基本上都是二进制文件,不需要特别指明。此外,mode参数还有其它用法,比如制定压缩率等,具体可以查看源代码。

 

不同的地方之一,FILE是一个关于文件信息的结构体,而不是void类型,之二,gzread()gzwrite()BZ2_bzread()BZ2_bzwrite()的参数位置与fread()fwrite()不一样,同时也省略了size_of_element参数

 

有了这两套API,我们就可以很方便地写出程序对文件进行压缩、解压缩操作,更多的是,把压缩、解压缩功能集成到自己的项目中去,使得项目支持压缩格式。举例如下:

 

  1. 如果使用libzAPI,压缩就是对源文件进行fopen()/fread()/fclose()操作,对目标文件进行gzopen()/gzwrite()/gzclose()操作;解压缩就是对源文件进行gzopen()/gzread()/gzclose()操作,对目标文件进行fopen()/fwrite()/fclose()操作
  2. 如果使用libbz2API,压缩就是对源文件进行fopen()/fread()/fclose()操作,对目标文件进行BZ2_bzopen()/BZ2_bzwrite()/BZ2_bzclose()操作;解压缩就是对源文件进行BZ2_bzopen()/BZ2_bzread()/BZ2_bzclose()操作,对目标文件进行fopen()/fwrite()/fclose()操作

 

如果要直接使用libzlibbz2,很简单,只需要做到三件事:

1.     include头文件。把zlib.hbzlib.h包含到项目源程序中

2.     链接库文件。如果由于权限问题不能安装库文件,需要在编译时指定库文件的路径

3.     如果库文件没有安装在系统默认的搜索路径,运行前还要修改LD_LIBRARY_PATH环境变量,使得运行时能够找到库文件

 

值得注意的是,以上列出的只是libzlibbz2里面最常用、比较高级的函数,其实,这两个库文件里还有其它底层的函数,利用这些底层函数,甚至可以解压.Z结尾的压缩文件。具体做法就要慢慢参透libz的全部源代码了。
阅读(1148) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~