zlib 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
zlib 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
zlib 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 zlib/libpng License
开发语言 C/C++ 查看源码 »
操作系统 Linux
软件类型 开源软件
开源组织
地区 不详
投 递 者 不详
适用人群 未知
收录时间 2008-12-04

软件简介

zlib 软件包包含 zlib 库,很多程序中的压缩或者解压缩函数都会用到这个库。zlib 适用于数据压缩的函式库,几乎适用于任何计算器硬件和操作系统。

特性:

  • 数据头(header)

zlib 能使用一个 gzip 数据头、zlib 数据头或者不使用数据头压缩数据。

通常情况下,数据压缩使用 zlib 数据头,因为这提供错误数据检测。当数据不使用数据头写入时,结果是没有任何错误检测的原始 DEFLATE 数据,那么解压缩软件的调用者不知道压缩数据在什么地方结束。

gzip 数据头比 zlib 数据头要大,因为它保存了文件名和其他文件系统信息,事实上这是广泛使用的gzip文件的数据头格式。注意 zlib 函式库本身不能创建一个 gzip 文件,但是它相当轻松的通过把压缩数据写入到一个有 gzip 文件头的文件中。

 

  • 算法

zlib 仅支持一个 LZ77 的变种算法,DEFLATE 的算法。

这个算法使用很少的系统资源,对各种数据提供很好的压缩效果。这也是在ZIP档案中无一例外的使用这个算法。(尽管zip文件格式也支持几种其他的算法)。

看起来zlib格式将不会被扩展使用任何其他算法,尽管数据头可以有这种可能性。

 

  • 使用资源

函数库提供了对处理器和内存使用控制的能力

不同的压缩级别数值可以指示不同的压缩执行速度。

还有内存控制管理的功能。这在一些诸如嵌入式系统这样内存有限制的环境中是有用的。

 

  • 策略

压缩可以针对特定类型的数据进行优化

如果你总是使用 zlib 库压缩压缩特定类型的数据,那么可以使用有针对性的策略可以提高压缩效率和性能。例如,如果你的数据包含很长的重复数据,那么可以用 RLE(运行长度编码)策略,可能会有更好的结果。

对于一般的数据,默认的策略是首选。

 

  • 错误处理

错误可以被发现和跳过

数据混乱可以被检测(只要数据和zlib或者gzip数据头一起被写入-参见上面)

此外,如果全刷新点(full-flush points)被写入到压缩后的数据流中,那么错误数据是可以被跳过的,并且解压缩将重新同步到下个全刷新点。(错误数据的无错恢复被提供)。全刷新点技术对于在不可靠的通道上的大数据流是很有用的,一些过去的数据丢失是不重要的(例如多媒体数据),但是建立太多的全刷新点会极大的影响速度和压缩。

 

  • 数据长度

对于压缩和解压缩,没有数据长度的限制

重复调用库函数允许处理无限的数据块。一些辅助代码(计数变量)可能会溢出,但是不影响实际的压缩和解压缩。

当压缩一个长(无限)数据流时,最好写入全刷新点。

 

使用范例

以下代码可直接用于解压 HTTP gzip

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <zlib.h>

/* Compress data */

int zcompress(Bytef *data, uLong ndata,

Bytef *zdata, uLong *nzdata)

{

z_stream c_stream;

int err = 0;

if(data && ndata > 0)

{

c_stream.zalloc = (alloc_func)0;

c_stream.zfree = (free_func)0;

c_stream.opaque = (voidpf)0;

if(deflateInit(&c_stream, Z_DEFAULT_COMPRESSION) != Z_OK) return -1;

c_stream.next_in = data;

c_stream.avail_in = ndata;

c_stream.next_out = zdata;

c_stream.avail_out = *nzdata;

while (c_stream.avail_in != 0 && c_stream.total_out < *nzdata)

{

if(deflate(&c_stream, Z_NO_FLUSH) != Z_OK) return -1;

}

if(c_stream.avail_in != 0) return c_stream.avail_in;

for (;;) {

if((err = deflate(&c_stream, Z_FINISH)) == Z_STREAM_END) break;

if(err != Z_OK) return -1;

}

if(deflateEnd(&c_stream) != Z_OK) return -1;

*nzdata = c_stream.total_out;

return 0;

}

return -1;

}

/* Compress gzip data */

int gzcompress(Bytef *data, uLong ndata,

Bytef *zdata, uLong *nzdata)

{

z_stream c_stream;

int err = 0;

if(data && ndata > 0)

{

c_stream.zalloc = (alloc_func)0;

c_stream.zfree = (free_func)0;

c_stream.opaque = (voidpf)0;

if(deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,

-MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) return -1;

c_stream.next_in = data;

c_stream.avail_in = ndata;

c_stream.next_out = zdata;

c_stream.avail_out = *nzdata;

while (c_stream.avail_in != 0 && c_stream.total_out < *nzdata)

{

if(deflate(&c_stream, Z_NO_FLUSH) != Z_OK) return -1;

}

if(c_stream.avail_in != 0) return c_stream.avail_in;

for (;;) {

if((err = deflate(&c_stream, Z_FINISH)) == Z_STREAM_END) break;

if(err != Z_OK) return -1;

}

if(deflateEnd(&c_stream) != Z_OK) return -1;

*nzdata = c_stream.total_out;

return 0;

}

return -1;

}

/* Uncompress data */

int zdecompress(Byte *zdata, uLong nzdata,

Byte *data, uLong *ndata)

{

int err = 0;

z_stream d_stream; /* decompression stream */

d_stream.zalloc = (alloc_func)0;

d_stream.zfree = (free_func)0;

d_stream.opaque = (voidpf)0;

d_stream.next_in = zdata;

d_stream.avail_in = 0;

d_stream.next_out = data;

if(inflateInit(&d_stream) != Z_OK) return -1;

while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {

d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */

if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;

if(err != Z_OK) return -1;

}

if(inflateEnd(&d_stream) != Z_OK) return -1;

*ndata = d_stream.total_out;

return 0;

}

/* HTTP gzip decompress */

int httpgzdecompress(Byte *zdata, uLong nzdata,

Byte *data, uLong *ndata)

{

int err = 0;

z_stream d_stream = {0}; /* decompression stream */

static char dummy_head[2] =

{

0x8 + 0x7 * 0x10,

(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,

};

d_stream.zalloc = (alloc_func)0;

d_stream.zfree = (free_func)0;

d_stream.opaque = (voidpf)0;

d_stream.next_in = zdata;

d_stream.avail_in = 0;

d_stream.next_out = data;

if(inflateInit2(&d_stream, 47) != Z_OK) return -1;

while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {

d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */

if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;

if(err != Z_OK )

{

if(err == Z_DATA_ERROR)

{

d_stream.next_in = (Bytef*) dummy_head;

d_stream.avail_in = sizeof(dummy_head);

if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)

{

return -1;

}

}

else return -1;

}

}

if(inflateEnd(&d_stream) != Z_OK) return -1;

*ndata = d_stream.total_out;

return 0;

}

/* Uncompress gzip data */

int gzdecompress(Byte *zdata, uLong nzdata,

Byte *data, uLong *ndata)

{

int err = 0;

z_stream d_stream = {0}; /* decompression stream */

static char dummy_head[2] =

{

0x8 + 0x7 * 0x10,

(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,

};

d_stream.zalloc = (alloc_func)0;

d_stream.zfree = (free_func)0;

d_stream.opaque = (voidpf)0;

d_stream.next_in = zdata;

d_stream.avail_in = 0;

d_stream.next_out = data;

if(inflateInit2(&d_stream, -MAX_WBITS) != Z_OK) return -1;

//if(inflateInit2(&d_stream, 47) != Z_OK) return -1;

while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {

d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */

if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;

if(err != Z_OK )

{

if(err == Z_DATA_ERROR)

{

d_stream.next_in = (Bytef*) dummy_head;

d_stream.avail_in = sizeof(dummy_head);

if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)

{

return -1;

}

}

else return -1;

}

}

if(inflateEnd(&d_stream) != Z_OK) return -1;

*ndata = d_stream.total_out;

return 0;

}

#ifdef _DEBUG_ZSTREAM

#define BUF_SIZE 65535

int main()

{

char *data = "kjdalkfjdflkjdlkfjdklfjdlkfjlkdjflkdjflddajfkdjfkdfaskf;ldsfk;ldakf;ldskfl;dskf;ld";

uLong ndata = strlen(data);

Bytef zdata[BUF_SIZE];

uLong nzdata = BUF_SIZE;

Bytef odata[BUF_SIZE];

uLong nodata = BUF_SIZE;

memset(zdata, 0, BUF_SIZE);

//if(zcompress((Bytef *)data, ndata, zdata, &nzdata) == 0)

if(gzcompress((Bytef *)data, ndata, zdata, &nzdata) == 0)

{

fprintf(stdout, "nzdata:%d %s\n", nzdata, zdata);

memset(odata, 0, BUF_SIZE);

//if(zdecompress(zdata, ndata, odata, &nodata) == 0)

if(gzdecompress(zdata, ndata, odata, &nodata) == 0)

{

fprintf(stdout, "%d %s\n", nodata, odata);

}

}

}

#endif

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (1)

加载中
更多评论
暂无内容
发表了博客
2014/01/03 02:54

zlib

http://www.zlib.net/ 不要用vc++ Express 2010软件有bug 编译有清单错误 vc: 直接 nmake -f win32/makefile.msc 清除前次编译 nmake -f win32/makefile.msc clean mingw: make -f win32/makefile.gcc cp -iv *.dll /mingw/bin;\ cp -iv zconf.h zlib.h /mingw/include;\ cp -iv *.a *.lib /mingw/lib; 或 cp -rfv *.dll /mingw/bin;\ cp -rfv zconf.h zlib.h /mingw/include;\ cp -rfv *.a *.lib /mingw/lib;...

0
1
发表了博客
2014/05/02 18:27

初始zlib

大名鼎鼎的zlib(ps. 我用google拼音,差点打成了周立波,囧),一直没有接触过,正好五一有时间,打算好好研究一番。 zlib是什么? zlib是提供资料压缩之用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表。zlib使用抽象化的DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。 zlib有什么作用? zlib的作用用最简单的话描述就是可以用来压缩...

0
2
发表于开发技能专区
2016/01/10 02:21

安装zlib

一般6.0以后的linux系统都已经安装了zlib,通过命令可以查看到:  $ rpm -qa|grep zlib  输出:zlib-1.2.7-13.el7.x86_64 目前最新版本zlib是zlib1.2.8,安装开始; $wget http://www.zlib.net/zlib-1.2.8.tar.gz $tar -xvzf zlib-1.2.8.tar.gz $cd zlib-1.2.8.tar.gz $./configure $make $sudo make instal 再安装 zlib-devel,为因太多的工具包、库的编译都在依赖他了,这里采用yum去安装 yum list install libpng-de...

0
0
发表了博客
2018/04/13 21:04

Zlib编译

转自原文 编译和使用zlib 由于要编译Cesium Terrain Build,其中不仅需要gdal,还用到了zlib,所以此时不得不总结一下Zlib的编译之道了。 在windows下用到zlib库,现成的库都是release版本的,如果项目是debug的就会导致一大堆符号错误,无奈只得自己重新编译zlib库。 (1)首先下载 源码和工程文件 解压到某个目录 (2)开启VS2010 的命令行 32bit 进入到zlib-1.2.5\contrib\masmx86目录 执行bld_ml32.bat (3)打开工程项目z...

0
0
发表了博客
2015/12/22 19:32

移植zlib1.1.4

1. 编译 zlib 库 由于 zlib 库的 configure 脚本不支持交叉编译选项,所以 我们只好使用符号链接把 gcc 指向我们的交叉编译器 armlinux-gcc,在编译完后再改回来即可. A. 把 gcc 指向我们的交叉编译器 arm-linux-gcc # cd /usr/bin # mv gcc gcc_back (备份 gcc) # ln -s /usr/local/arm/3.4.1/bin/arm-linux-gcc ./gcc (创建 gcc 到 arm-linux-gcc 的符号连接) # mv ld ld_back (备份 ld) # ln -s /usr/local/arm/3.4.1/bin/arm...

0
0
发表于软件架构专区
2016/09/20 02:48

openresty使用zlib

sudo yum install lua-devel 在github上查找 lua-zlib切到最新tag编译。把生成的zlib.so复制到openresty/lualib目录下 然后在lua代码中require zlib 并调用 具体参考文档

0
0
发表了博客
2018/08/21 00:06

【Linux】zlib安装

zlib简介   zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表。zlib使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。截至2007年3月,zlib是包含在Coverity的美国国土安全部赞助者选择继续审查的开源项目。 zlib安装   环境:Linux(CentOS 7.4)   1、下载,官网:http://www.zlib.net/,本例使用版本:z...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了问答
2016/02/17 11:31

linux C zip 压缩 字符串

项目需要通过zip压缩进行数据传输,linux c为客户端,java为服务端,通过TCP发送,目前已实现java版本的zip压缩解压缩。 现在还需要实现C客户端的zip压缩。 尝试使用zlib的compress,长度不一样,一个字符压缩后长度只有9,java端压缩后长度为50。 试了一下GZIP,在c端使用zlib压缩,java端能够解压,规范要求使用zip。 在c端进行zip压缩,是否还有其他可用?...

2
0
发表了问答
2015/05/03 20:37

cannot find -lzlib怎么解决

我用的ubuntu系统,codeblocks编译器,在程序中用到了gzip的功能函数,编译时报错:connot find -lzlib 但是输入命令 whereis zlib 显示:zlib: /usr/include/zlib.h /usr/share/man/man3/zlib.3.gz 说明我已经安装了zlib的啊,那为什么连接不上呢 我是第一次用codeblocks,也不会用,不知道是不是哪里没添加上,对ubuntu也很不熟悉。...

1
0
发表了问答
2015/05/01 19:57

BZ2_bawriteOpen()与BZ2open()的区别?

BZ2_bawriteOpen()与BZ2open()功能及用法上有什么区别呢? BZ2_bzWriteClose()与BZ2close()功能及用法上有什么区别? 如 mp_bzip2File = BZ2_bzWriteOpen(&returnValue, mp_rawFileOut, blockSize, verbosity, workFactor); BZ2_bzWriteClose( &returnValue, mp_bzip2File, 0, NULL, NULL ); 若我想改用BZ2open()和BZ2close()应该怎么改呢?...

1
0
发表了问答
2008/12/04 20:28

Zlib函数列表和使用手册

http://blog.csdn.net/kangzhaolong/archive/2006/08/16/1074083.aspx

4
0
发表了问答
2013/07/18 14:11

解析document.xml文件的内容

最近想获取word中的文字,后缀为.doc的已经获取了,.docx的有点麻烦,现在从word(.docx)中获取出来了document.xml,但是在网上查了一些代码,总是运行不对,说document.xml的开始不是根(树形结构),求大侠们指导啊!!!谢谢!!!

1
0
发表了问答
2012/12/04 09:50

怎么用zlib生成标准zip压缩文件和解压缩zip文件

按照以下链接中的方法,在使用zipOpen64,zipOpenNewFileInZip时就提示找不到标示符,请问怎么用zlib库生成标准的zip文件,我开始时使用compress 和 uncompresse两个函数即可以实现压缩解压缩,但这是字符串的解压缩,不能生成标准的zip文件。 http://blog.csdn.net/okadler0518/article/details/6131327

2
0
发表了问答
2011/04/19 17:00

zlib.net 打不开.

zlib.net 打不开. libgd.org 也打不开... 唉.神啊. 给我一根绳子吧. 我要上吊, 或者用来....

9
1
发表了问答
2012/03/23 20:11

请问zlib授权的软件可以免费用于商业吗

2
0
发表了问答
2012/03/05 11:47

zlib ADLER32如何计算

zlib 解压缩zip文件中的某个文件时需要用到ADLER32 但是这个校验码 在zip文件中找不到,它是如何算出来的呢

1
0
发表了问答
2011/07/03 15:46

ubuntu11.04下 python 安装mysqldb库

ubuntu11.04下python的版本是2.7,可是mysqldb支持python2.2-2.6,所以我源码编译了一个2.6版本,安装路径是/usr/local。安装mysqldb之前,得安装setuptools,我也打算源码编译安装,可是安装的时候显示“missing zlib”????我该怎么办呢,python2.6中的文档显示是可以用zlib的啊,可是无法导入zlib模块。倒是可以apt安装setuptools,不过这个应该是对应ubuntu系统原装的2.7版本的python的吧,我源码编译的2.6版本的python应该是...

4
0
发表了问答
2009/12/11 11:38

zlib的网友评论

Zlib 软件包包含 zlib 库,很多程序中的压缩或者解压缩函数都会用到这个库.

3
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
1 评论
67 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部