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介绍的更多相关文章

  1. (转)神经网络和深度学习简史(第一部分):从感知机到BP算法

    深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...

  2. 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

    随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...

  3. 深度学习与CV教程(8) | 常见深度学习框架介绍

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  4. [DeeplearningAI笔记]神经网络与深度学习人工智能行业大师访谈

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 吴恩达采访Geoffrey Hinton NG:前几十年,你就已经发明了这么多神经网络和深度学习相关的概念,我其实很好奇,在这么多你发明的东西中 ...

  5. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验【中英】

    [中英][吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第二周测验 第2周测验 - 神经网络基础 神经元节点计算什么? [ ]神经元节点先计算激活函数,再计算线性函数(z = Wx + ...

  6. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

    [吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和“AI是新电力”相类似的说法是什么? [  ]AI为我们的家庭和办公室的个人设备供电 ...

  7. 如何理解归一化(Normalization)对于神经网络(深度学习)的帮助?

    如何理解归一化(Normalization)对于神经网络(深度学习)的帮助? 作者:知乎用户链接:https://www.zhihu.com/question/326034346/answer/730 ...

  8. 【神经网络与深度学习】卷积神经网络(CNN)

    [神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...

  9. 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试

    [神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...

  10. 【神经网络与深度学习】【Matlab开发】caffe-windows使能Matlab2015b接口

    [神经网络与深度学习][Matlab开发]caffe-windows使能Matlab2015b接口 标签:[神经网络与深度学习] [Matlab开发] 主要是想全部来一次,所以使能了Matlab的接口 ...

随机推荐

  1. 【SQL Server】使用SQL比较版本号

    最近遇到这么一个场景,需要用SQL从表里取出版本号小于'10.2'的所有数据.目前表中以存在的数据中,版本号有两种格式,一个是'X.Y',另一个是'X'.对于SQL Server来说,其没有strin ...

  2. 【Python之路】特别篇--Python装饰器

    前情提要 1. 作用域 在python中,函数会创建一个新的作用域.python开发者可能会说函数有自己的命名空间,差不多一个意思.这意味着在函数内部碰到一个变量的时候函数会优先在自己的命名空间里面去 ...

  3. BZOJ 3782: 上学路 Lucas+ExCRT+容斥+dp

    其实呢,扩展中国剩余定理还有一种理解方式:就是你有一坨东西,形如:$A[i]\equiv B[i](mod$ $P[i])$. 对于这个东西,你可以这么思考:如果最后能求出一个解,那么这个解的增量一定 ...

  4. P4981 父子 Cayley公式

    CayleyCayley公式的定义是这样的,对于n个不同的节点,能够组成的无根树(原来是无向连通图或者是有标志节点的树)的种数是n^(n-2)种.(这里让大家好理解一点,就写成了无根树,其实应该是一样 ...

  5. 回文数二(acm训练)

    问题 1161: [回文数(二)] 时间限制: 1Sec 内存限制: 128MB 提交: 133 解决: 51 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数.  ...

  6. flask框架(八): 响应和请求

    from flask import Flask from flask import request from flask import render_template from flask impor ...

  7. 项目部署中,tomcat报java.lang.OutOfMemoryError: PermGen space

    原因: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader ...

  8. LVS集群之NAT模式

    集群的分类: (1)HA:高可用集群,有叫双机热备 原理:两台机器A.B,正常是A提供服务,当A机宕机或者服务有问题时,会切换到B机继续提供服务常用的高了永软件:heartbeat和keepalive ...

  9. 前端中的 Attribute & Property

    为了在翻译上显示出区别,Attribute一般被翻译为特性,Property被译为属性. 在使用上面,Angular已经表明态度 Template binding works with propert ...

  10. canvas基础知识点(一)

    给canvas设置宽高: canvas标签的宽高默认是300*150,是一个行内块元素 可以在canvas标签上通过width,height来设置 可以在js中给dom对象设置: mycanvas.w ...