zlib的安装与使用
zlib是一个很好的压缩解压缩库,今天我们分别介绍如何在Linux与Windows上安装与使用:
一:Linux平台
首先看看自己的机器上是不是已经安装好zlib了:
whereis zlib
如果安装好了,会输出zlib的路径,这样直接跳过前2步。
1.
在http://www.zlib.net/下载zlib的最新版,我的是1.2.3(官网貌似上不去,可以找别的地方下载)
2.
解压,编译:
./configure
make
sudo make install
3.
zlib安装好了,下面我们写一个程序测试一下:
Makefile:
- all: test.c
- gcc -Wall -o test test.c -lz
- clean:
- rm -rf *.o test
all: test.c
gcc -Wall -o test test.c -lz
clean:
rm -rf *.o test
注意到,我们用-lz加入了zlib库
test.c
- #include <stdio.h>
- #include <zlib.h>
- int main()
- {
- /* 原始数据 */
- unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文测试 yes";
- unsigned char buf[1024] = {0};
- unsigned char strDst[1024] = {0};
- unsigned long srcLen = sizeof(strSrc);
- unsigned long bufLen = sizeof(buf);
- unsigned long dstLen = sizeof(strDst);
- printf("Src string:%s\nLength:%ld\n", strSrc, srcLen);
- /* 压缩 */
- compress(buf, &bufLen, strSrc, srcLen);
- printf("After Compressed Length:%ld\n", bufLen);
- /* 解压缩 */
- uncompress(strDst, &dstLen, buf, bufLen);
- printf("After UnCompressed Length:%ld\n",dstLen);
- printf("UnCompressed String:%s\n",strDst);
- return 0;
- }
#include <stdio.h>
#include <zlib.h>
int main()
{
/* 原始数据 */
unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文测试 yes";
unsigned char buf[1024] = {0};
unsigned char strDst[1024] = {0};
unsigned long srcLen = sizeof(strSrc);
unsigned long bufLen = sizeof(buf);
unsigned long dstLen = sizeof(strDst);
printf("Src string:%s\nLength:%ld\n", strSrc, srcLen);
/* 压缩 */
compress(buf, &bufLen, strSrc, srcLen);
printf("After Compressed Length:%ld\n", bufLen);
/* 解压缩 */
uncompress(strDst, &dstLen, buf, bufLen);
printf("After UnCompressed Length:%ld\n",dstLen);
printf("UnCompressed String:%s\n",strDst);
return 0;
}
4.
运行结果如下所示:
呵呵,只压缩掉了一个字节。
我们用到了两个函数:compress和uncompress:
压缩:
int compress(unsigned char * dest, unsigned long * destLen, unsigned char * source, unsigned long sourceLen);
dest:压缩后数据保存的目标缓冲区
destLen:目标缓冲区的大小(必须在调用前设置,并且它是一个指针)
source:要压缩的数据
sourceLen:要压缩的数据长度
compress()函数成功返回Z_OK,如果内存不够,返回Z_MEM_ERROR,如果目标缓冲区太小,返回Z_BUF_ERROR
解压缩:
int uncompress(unsigned char * dest, unsigned long * destLen, unsigned char * source, unsigned long sourceLen);
dest:解压后数据保存的目标缓冲区
destLen:目标缓冲区的大小(必须在调用前设置,并且它是一个指针)
source:要解压的数据
sourceLen:要解压的数据长度
uncompress()函数成功返回Z_OK,如果内存不够,返回Z_MEM_ERROR,如果目标缓冲区太小,返回Z_BUF_ERROR,如果要解压的数据损坏或不完整,返回Z_DATA_ERROR。
二:Windows平台
zlib提供了用VC++6.0编译的版本,因此我们首先在Windows下编译zlib的源代码,然后再用上面的例子测试:
1.
解压zlib-1.2.3-src.zip(文末有链接),打开zlib.dsw,直接编译,提示:
'ml.exe' 不是内部或外部命令,也不是可运行的程序或批处理文件。
2.
因为ml.exe是微软的汇编编译器,我们不需要,因此:Build-->Set Active Project Configuration,将所有的带"ASM"的项都去掉,然后选择Win32 LIB Debug,如下图:
3.
在zlib classes上右键选择设为启动项目,然后再编译,出现如下错误:
fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory compress.c
unistd.h是Linux下的文件,我们不需要,只要将#if 1 改为#if 0即可,如下图所示:
4.
再编译,发现出现如下4个错误:
error C2059: syntax error : 'bad suffix on number'
error C2146: syntax error : missing ')' before identifier 'L'
error C2198: 'gzseek' : too few actual parameters
error C2059: syntax error : ')'
没关系,将0LL改为0L即可(即去掉一个L),如下图:
5.
再编译,没有错误,如下图:
6.
zlib编译好后,会生成zlib1.lib和zlib1.dll两个文件,这正是我们需要的。
下面还是用之前的测试程序:
新建一个VC++6工程,加入如下的代码,并将zlib1.dll拷贝到项目目录下:
- #include <stdio.h>
- #include "../zlib/include/zlib.h"
- #pragma comment(lib, "../zlib/lib/zlib1.lib")
- int main()
- {
- /* 原始数据 */
- unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文测试 yes";
- unsigned char buf[1024] = {0};
- unsigned char strDst[1024] = {0};
- unsigned long srcLen = sizeof(strSrc);
- unsigned long bufLen = sizeof(buf);
- unsigned long dstLen = sizeof(strDst);
- printf("Src string:%s\nLength:%ld\n", strSrc, srcLen);
- /* 压缩 */
- compress(buf, &bufLen, strSrc, srcLen);
- printf("After Compressed Length:%ld\n", bufLen);
- /* 解压缩 */
- uncompress(strDst, &dstLen, buf, bufLen);
- printf("After UnCompressed Length:%ld\n",dstLen);
- printf("UnCompressed String:%s\n",strDst);
- return 0;
- }
#include <stdio.h>
#include "../zlib/include/zlib.h"
#pragma comment(lib, "../zlib/lib/zlib1.lib")
int main()
{
/* 原始数据 */
unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文测试 yes";
unsigned char buf[1024] = {0};
unsigned char strDst[1024] = {0};
unsigned long srcLen = sizeof(strSrc);
unsigned long bufLen = sizeof(buf);
unsigned long dstLen = sizeof(strDst);
printf("Src string:%s\nLength:%ld\n", strSrc, srcLen);
/* 压缩 */
compress(buf, &bufLen, strSrc, srcLen);
printf("After Compressed Length:%ld\n", bufLen);
/* 解压缩 */
uncompress(strDst, &dstLen, buf, bufLen);
printf("After UnCompressed Length:%ld\n",dstLen);
printf("UnCompressed String:%s\n",strDst);
return 0;
}
和之前的程序类似,只多了#pragma comment,这里需要填入zlib1.lib的正确路径
然后运行,一切正常,如下图:
呵呵,我们发现同样的字符串在Linux和Windows上长度是不一样的!
另外还要说的是我们编译的VC++6.0版的zlib工程中包含一个example示例程序,可以参考参考。
为了方便大家,本文的所有源码都可以下载:
http://download.csdn.net/detail/htttw/4340134
下面是网上摘录的zlib的其他重要函数:
关键的函数有那么几个:
(1) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间
(2) uLong compressBound (uLong sourceLen);
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度
(3) deflateInit() + deflate() + deflateEnd();
3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)
(4) inflateInit() + inflate() + inflateEnd()
和(5)类似,完成解压缩功能.
(5) gz开头的函数.
用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.
(6) 其他诸如获得版本等函数就不说了.
zlib的安装与使用相关推荐
- linux下Zlib的安装与使用
1. zlib简介 zlib 适用于数据压缩的函式库,由Jean-loup Gailly (负责compression)和 Mark Adler (负责decompression)开发. zlib被设 ...
- Zlib的安装与测试
官方网址:http://www.zlib.net/ 进入官网看到,如图所示,最新版本为zlib 1.2.11 然后你用wget http://www.zlib.net/zlib 1.2.11或者wg ...
- zlib库 安装与使用
1. zlib简介 zlib 适用于数据压缩的函式库,由Jean-loup Gailly (负责compression)和 Mark Adler (负责decompression)开发. zlib被设 ...
- zlib 离线安装_黑板派Python扩展库安装与常见问题解决完整指南
点击蓝字 ! 关注我们 "Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国, ...
- python zlib module_python 安装 setuptools Compression requires the (missing) zlib module 的解决方案...
安装 setuptools 的时候,报如下错误: creating 'dist/setuptools-0.6c11-py2.7.egg' and adding 'build/bdist.linux-x ...
- ubuntu下安装nginx时依赖库zlib,pcre,openssl安装方法
首先使用dpkg命令查看自己需要的软件是否安装. 例如查看zlib是否安装: dpkg -l | grep zlib 解决依赖包openssl安装,命令: sudo apt-get install o ...
- linux安装zlib_Linux zlib和libpng安装(LAMP环境搭建)
本节讲解 Linux 在搭建 LAMP 环境过程中对 zlib 和 libpng 源码包的安装. 安装zlib源码包 zlib 是提供数据压缩用的函数库,使用 DEFLATE 算法,最初是为 libp ...
- linux yum zlib安装,Centos升级zlib库导致yum运行错误
今天在编译LNMP环境时,遇到系统zlib版本有点低,由于Nginx需要指定zlib库安装位置,所以干脆就直接替换掉系统自带的zlib.在这里遇到了一个问题:升级zlib时候,是用yum直接升级呢,还 ...
- centos 7 在线安装nginx 查看gcc,pcre,zlib,openssl 等依赖是否安装
之前整理过centos 7 离线安装nginx的步骤 在线安装相对操作就简易多了 查看安装nginx需要的依赖是否已安装 没安装yum指令在线安装即可 我使用的是centos7.6版本 安装的ngin ...
最新文章
- Windows和VMware虚拟机相互间无法复制的解决方案
- Myeclipse学习总结(8)——Eclipse实用操作
- org.springframework.amqp.AmqpConnectException java.net.ConnectException的解决办法
- ElasticSearch和mysql对比
- Spring Cloud微服务之Feign服务调用(十一)
- MYSQL8.0 排序查询报错 this is incompatible with sql_mode=only_full_group_by
- 【GNN】一份简短入门《图神经网络GNN》笔记小册
- java的消息机制协议_消息推送机制技术设计
- 在操作系统中进程是如何通信的
- R 语言从Github上安装R语言的程序包
- 数值计算之第三期:直接法解线性方程组
- python怎么写代码求年华收益率_如何计算年化收益率?
- 大学生体育运动网页设计模板代码 DIV布局校园运动网页作业成品 HTML学校网页制作模板 学生简单体育运动网站设计成品
- Qt实战(二)——方块游戏
- mysql数据库 auto_increment_mysql学习笔记(二:中的auto_increment 理解
- 东昂科技冲刺深交所:年营收2.6亿 庄俊辉控制69%股权
- np.cosh没有分配_Python中带有示例的math.cosh()方法
- 让家庭机器人成标配,我们还需要等多久?
- 模拟电子技术(五)放大电路中的反馈
- win10简繁体输入转换输入法设置转换