Zlib库学习总结

zlib类库提供了很多种压缩和解压缩的方式,由于时间的关系我只学习一下内容,以下是我在实现web 服务器压缩数据网页中使用到一些函数和常用数据结构、常量等。

zlib使用过程

压缩过程:deflateInit() ->deflate() ->deflateEnd();  对应的解压过程 inflateInit() ->  inflate() ->  inflateEnd();

压缩过程:deflateInit2() ->deflate() ->deflateEnd();  对应的解压过程 inflateInit2() ->  inflate() ->  inflateEnd();

zlib使用的实例请看:

http://www.zlib.net/zlib_how.html 注释内容详细(英文)

web服务器是如何通过压缩数据,web服务器的gzip模块的实现  我自己写的(中文)

zlib解压缩的实现实例(来自百度百科,本人未加正式,请谅解)

常用的数据结构

typedef struct z_stream_s {

z_const Bytef *next_in;     //要压缩数据的首地址

uInt     avail_in;  //压缩数据的长度

uLong    total_in;  //压缩数据缓冲区的长度

Bytef    *next_out; //压缩数据保存位置。

uInt     avail_out; //存放压缩数据位置的首地址

uLong    total_out; //存放压缩数据位置的大小

z_const char *msg;  //存放最近的错误信息,NULL表示没有错误

struct internal_state FAR *state; /* not visible by applications */

alloc_func zalloc;  /* used to allocate the internal state */

free_func  zfree;   /* used to free the internal state */

voidpf     opaque;  /* private data object passed to zalloc and zfree */

int     data_type;  // 表示数据类型,文本或者二进制

uLong   adler;      /* adler32 value of the uncompressed data */

uLong   reserved;   /* reserved for future use */

} z_stream;

对于z_stream我们一般使用

z_stream stream;

在deflateInit()或者inflateInit()前设置的参数,初始化参数设置

stream.zalloc = Z_NULL;

stream.zfree = Z_NULL;

stream.opaque = Z_NULL;

stream.avail_in = 0;

stream.next_in = Z_NULL;

在deflate()或inflate前设置的参数,压缩前的参数设置

strm.avail_in = in_len;

strm.next_in = in;

strm.avail_out = out_len;

strm.next_out = out;

常用的常量

用来设置压缩和解压缩时,结果数据输出的方式,具体区别没有看懂的(为了避免误导大家,大家尽量看http://www.zlib.net/manual.html英文帮助吧)

#define Z_NO_FLUSH      0  //没有缓存,直接写入到结果中

#define Z_PARTIAL_FLUSH 1

#define Z_SYNC_FLUSH    2

#define Z_FULL_FLUSH    3

#define Z_FINISH        4    //采用此种方式,压缩将会变成单步执行。

#define Z_BLOCK         5

#define Z_TREES         6

函数返回值得定义

#define Z_OK            0

#define Z_STREAM_END    1

#define Z_NEED_DICT     2

#define Z_ERRNO        (-1)

#define Z_STREAM_ERROR (-2)

#define Z_DATA_ERROR   (-3)

#define Z_MEM_ERROR    (-4)

#define Z_BUF_ERROR    (-5)

#define Z_VERSION_ERROR (-6)

注释:负值是错误,正值用于特别,但正常活动。

定义常用的压缩级别

#define Z_NO_COMPRESSION         0

#define Z_BEST_SPEED             1

#define Z_BEST_COMPRESSION       9

#define Z_DEFAULT_COMPRESSION  (-1)

注释:压缩级别是一个0-9的数字,0压缩速度最快(压缩的过程),9压缩速度最慢,压缩率最大,0不压缩数据

压缩算法的选择

#define Z_FILTERED            1    //Huffman编码和字符串匹配结合

#define Z_HUFFMAN_ONLY        2  //仅采用霍夫曼编码,没有字符匹配

#define Z_RLE                 3    //限制相匹配的距离为1

#define Z_FIXED               4

#define Z_DEFAULT_STRATEGY    0  //默认压缩方法。

Possible values of the data_type field (though see inflate()).

#define Z_BINARY   0

#define Z_TEXT     1

#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */

#define Z_UNKNOWN  2

默认的压缩方式,仅支持当前一种

#define Z_DEFLATED   8

常用的函数

int deflateInit ((z_streamp strm, int level));

include: zlib.h

description: 初始化压缩状态,关联相关的z_stream数据结构和压缩比例

parameter:

strm: 要关联的z_stream数据结构

level:压缩比例,压缩级别是一个0-9的数字,0压缩速度最快(压缩的过程),9压缩速度最慢,压缩率最大,0不压缩数据

int deflateInit2 ((z_streamp strm, //关联的数据结构

int  level,

int  method,

int  windowBits,

int  memLevel,

int  strategy));

include: zlib.h

description: 压缩的初始化

parameter:

strm:关联的数据结构

level:压缩级别,压缩级别是一个0-9的数字,0压缩速度最快(压缩的过程),9压缩速度最慢,压缩率最大,0不压缩数

method:压缩的模式,现在只有一种。Z_DEFLATED(表示数字8)

windowBits:表示处理raw deflate的方法。windowBits为8..15,也可以为-8...-15。当值为16时,将会加上一个简单gzip头部和尾部。

memLevel:指定的内部压缩状态,应该分配多少内存。 memLevel=1使用的最小内存,但很慢,降低了压缩比; memLevel=9使用的最大内存以获得最佳的速度。默认值是8。请参阅作为的函数windowBits和memLevel的使用的总内存zconf.h。

strategy:压缩的策略

int deflate ((z_streamp strm, int flush));

include: zlib.h

description: 压缩数据

parameter:

strm: 关联的数据结构,要压缩的数据、长度、压缩数据的存放位置和可用大小,都在其中设置的

flush: 采用何种法师将压缩的数据写到缓冲区中。

int deflateEnd ((z_streamp strm))

include: zlib.h

description: 压缩结束

parameter:

strm: 关联的数据结构,释放资源

时间: 2024-10-13 15:45:05

Zlib库学习总结的相关文章

Libev库学习

Libev库学习 https://www.cnblogs.com/wunaozai/p/3950249.html Libev库学习(1)https://www.cnblogs.com/wunaozai/p/3954131.html Libev库学习(2)https://www.cnblogs.com/wunaozai/p/3955156.html Libev库学习(3)https://www.cnblogs.com/wunaozai/p/3960494.html Zlib库的安装与使用 http

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

【python标准库学习】thread,threading(一)多线程的介绍和使用

在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线程运行,这个线程就是主线程main,在主线程中所创建的新的线程都是子线程,子线程通常都是做一些辅助的事.python中提供了thread和threading两个模块来支持多线程. python中使用线程有两种方式,第一种是用thread模块的start_new_thread函数,另一种是用threa

[C/C++]_[初级]_[使用zlib库压缩文件]

场景: 1. WIndows上没找到系统提供的win32 api来生成zip压缩文件, 有知道的大牛麻烦留个言. 2. zlib比较常用,编译也方便,使用它来做压缩吧.MacOSX平台默认支持zlib库. http://zlib.net 3. zlib库里的 src\contrib\minizip\minizip.c  里有压缩例子, 我现在使用的是zlib 1.2.5,用vs2010编译完.下载地址: http://download.csdn.net/detail/infoworld/8177

0806------Linux网络编程----------Echo 网络库 学习笔记

1.Echo网络库的编写 1.1 Echo网络库1.0 1.1.1 Echo网络库 1.0 框架分析 a)class InetAddress: 主要用来定义一个struct sockaddr_in 结构(用自定义端口号初始化),并提供获取这个结构体成员如IP.Port等的接口: b)class Socket : 主要用来把一个普通的 sockfd 变为 listenfd(这里用一个sockfd初始化对象),提供bind .listen.accept 等接口. c)class TcpConnect

c++ boost库学习三:实用工具

noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c="^_^" 时会发生一些意想不到的行为,所以很多时候我们需要禁用这样的用法. 一种方法就是把拷贝构造函数和赋值操作符显式的定义为private,但是这样需要很多代码. 于是boost库为大家提供了一个简单的方法:只需要将类继承于noncopyable就可以了. #include "

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l

python第三方库学习之xlrd读取Excel文件

因为经常会涉及到从Excel表中导数据,所以就学习了python的xlrd来读取excel中的数据. 1.xlrd的安装 xlrd是python的第三方库,所以是需要自己安装的,可以在python的官网http://pypi.python.org/pypi/xlrd下载该模块来安装,也可以通过其他手段,比如easy_install或者pip啥的,我已经安装好pip所以就用最懒的方式来安装了pip install xlrd来安装. 2.分析excel文件的层级对象 要读取excel的数据,就要了解

Zlib库的安装与使用

在实际应用中经常会遇到要压缩数据的问题,常见的压缩格式有zip和rar,而Linux下那就更多了,bz2,gz,xz什么的都有,单单Linux下的解压和压缩命令就有好多呢?没有什么好不好的.查了资料,应该是zlib这个比较简单好用.应用也广,所以就准备用这个了. 下载Zlib库,地址: http://zlib.net/zlib128.zip 用wget下载,然后再用unzip解压一下,然后就像一般软件一样 ./configure && make && make instal