Zlib一些参数详解

2024-06-05 13:08
文章标签 参数 详解 zlib

本文主要是介绍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: 关联的数据结构,释放资源

这篇关于Zlib一些参数详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033140

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创