zlib安装和使用 linux

article/2025/10/9 10:45:45

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:

[cpp] view plain copy print ?
  1. all: test.c  
  2.     gcc -Wall -o test test.c -lz  
  3.   
  4. clean:  
  5.     rm -rf *.o test  
all: test.cgcc -Wall -o test test.c -lzclean:rm -rf *.o test


注意到,我们用-lz加入了zlib库


test.c

[cpp] view plain copy print ?
  1. #include <stdio.h>  
  2. #include <zlib.h>  
  3.   
  4. int main()  
  5. {  
  6.   /* 原始数据 */  
  7.   unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文测试 yes";  
  8.   unsigned char buf[1024] = {0};  
  9.   unsigned char strDst[1024] = {0};  
  10.   unsigned long srcLen = sizeof(strSrc);  
  11.   unsigned long bufLen = sizeof(buf);  
  12.   unsigned long dstLen = sizeof(strDst);  
  13.   
  14.   printf("Src string:%s\nLength:%ld\n", strSrc, srcLen);  
  15.     
  16.   /* 压缩 */  
  17.   compress(buf, &bufLen, strSrc, srcLen);  
  18.   printf("After Compressed Length:%ld\n", bufLen);  
  19.   
  20.   /* 解压缩 */  
  21.   uncompress(strDst, &dstLen, buf, bufLen);  
  22.   printf("After UnCompressed Length:%ld\n",dstLen);  
  23.   
  24.   printf("UnCompressed String:%s\n",strDst);  
  25.     
  26.   return 0;  
  27. }  
#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拷贝到项目目录下

[cpp] view plain copy print ?
  1. #include <stdio.h>  
  2. #include "../zlib/include/zlib.h"  
  3. #pragma comment(lib, "../zlib/lib/zlib1.lib")  
  4.   
  5. int main()  
  6. {  
  7.   /* 原始数据 */  
  8.   unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文测试 yes";  
  9.   unsigned char buf[1024] = {0};  
  10.   unsigned char strDst[1024] = {0};  
  11.   unsigned long srcLen = sizeof(strSrc);  
  12.   unsigned long bufLen = sizeof(buf);  
  13.   unsigned long dstLen = sizeof(strDst);  
  14.   
  15.   printf("Src string:%s\nLength:%ld\n", strSrc, srcLen);  
  16.     
  17.   /* 压缩 */  
  18.   compress(buf, &bufLen, strSrc, srcLen);  
  19.   printf("After Compressed Length:%ld\n", bufLen);  
  20.   
  21.   /* 解压缩 */  
  22.   uncompress(strDst, &dstLen, buf, bufLen);  
  23.   printf("After UnCompressed Length:%ld\n",dstLen);  
  24.   
  25.   printf("UnCompressed String:%s\n",strDst);  
  26.     
  27.   return 0;  
  28. }  
#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) 其他诸如获得版本等函数就不说了.


http://chatgpt.dhexx.cn/article/V79WNQXj.shtml

相关文章

zlib开发笔记(一):zlib库介绍、编译和工程模板

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/111877005 长期持续带来更多项目与技术分享&#xff0c;咨询请加QQ:21497936、微信&#xff1a;yangsir198808 红胖子(红模仿)的博文大全&#x…

zlib包的下载

zlib包下载地址&#xff1a;http://www.zlib.net/ 这里注意很多帖子都是直接给了具体的连接&#xff0c;比如&#xff1a; wget http://www.zlib.net/zlib-1.2.8.tar.gz 然后... 所以&#xff0c;这里不宜生搬硬套&#xff0c;直接去官网上看&#xff0c;源码地址 ... 然后&am…

安装最新版本zlib

官方网址:http://www.zlib.net/ 进入官网看到,如图所示,最新版本为zlib 1.2.11 然后你用wget http://www.zlib.net/zlib 1.2.11或者wget http://www.zlib.net/zlib-1.2.11下载,那你永远下载不了. 嘿嘿,正确的下载方式是wget http://www.zlib.net/zlib-1.2.11.tar.gz 进入…

C++封装zlib库

C封装zlib库 1、zlib简介2、如何下载zlib库源代码3、如何安装zlib库4、zlib代码封装步骤4.1、编写初始化函数4.2、编写压缩、解压函数4.3、编写刷新数据函数 5、结论并附上源代码 1、zlib简介 zlib是提供数据压缩用的函式库&#xff0c;最早是由Jean-loup Gailly与Mark Adler所…

使用zlib库解压文件

下载zlib库源码&#xff1a;http://www.zlib.net/ 编译lib库 选择对应的Visual Studio工程目录打开zlibvc.sln文件&#xff0c;工程设置为Release模式&#xff0c;选中zlibstat项&#xff0c;将预处理器中的ASMINF宏删除&#xff08;重要否则会产生 L_get_length_code_mmx 的崩…

zlib的使用

测试项目目录结构如图 其中zlib源文件放置在libz目录下。 将ZLib源文件编译成静态库 1.在libz-cmake目录下的CMakeLists.txt中编写如下命令&#xff0c;生成静态库。 cmake_minimum_required (VERSION 3.3)project (z)file (GLOB_RECURSE SOURCES ${CMAKE_SOURCE_DIR}/libz/…

【zlib】linux安装zlib

一、zlib zlib适用于数据压缩的函式库&#xff0c;由Jean-oup Gailly(负责compression)和 MarkAdler(负责decompression)开发。 zlib被设计成一个免费的、通用的、法律上不受阻碍&#xff08;即没有被任何专利覆盖)的无损数据压缩库。zib几乎适用于任何计算器硬件和操作系统。…

linux下Zlib的安装与使用

1. zlib简介 zlib 适用于数据压缩的函式库,由Jean-loup Gailly (负责compression)和 Mark Adler (负责decompression)开发。    zlib被设计成一个免费的、通用的、法律上不受阻碍(即没有被任何专利覆盖) 的无损数据压缩库。zlib几乎适用于任何计算器硬件和操作系统。…

zlib开发笔记(二):zlib库介绍、ubuntu平台编译和工程模板

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/118713737 长期持续带来更多项目与技术分享&#xff0c;咨询请加QQ:21497936、微信&#xff1a;yangsir198808 红胖子(红模仿)的博文大全&…

zlib使用教程

下载zlib http://www.zlib.net/ 编译zlib库 打开sln: zlib-1.2.11\contrib\vstudio\vc12\zlibvc.sln 生成库位置&#xff1a; zlib-1.2.11\contrib\vstudio\vc12\x86\ZlibDllRelease 调用zlib库 添加lib依赖库位置&#xff1a;zlibwapi.lib的文件位置 添加zlibwapi…

zlib库介绍一:zlib简介

目录 1.库简介 2.算法 3.计算资源 4.数据长度 5.业界使用 1.库简介 zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&#xff09;压缩和解压函数&#xff0c;能检测解压出来的数据完整性&#xff0c;由Jean-loup Gailly与Mark Adler所开发。源…

zlib压缩原理

数据压缩的本质 去除数据中的冗余信息&#xff0c;对于ABABABABABABAB字样的字符串&#xff0c;AB出现了7次&#xff0c;占用14个字节&#xff0c;如果将该字符串编码为7AB&#xff0c;只占用3个字节。 为什么需要对数据压缩 数据需要存储或者传输&#xff0c;为了节省磁盘空…

第三方库介绍——zlib库

文章目录 zlib1. zlib库介绍2. zlib库的应用3. 下载地址4. 函数使用教程4.1 compress 与 uncompress4.3 使用过程解析4.2 infate、deflate、z_stream 5. 交叉编译zlib库 zlib 1. zlib库介绍 zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&#x…

Zlib的安装与测试

官方网址:http://www.zlib.net/ 进入官网看到,如图所示,最新版本为zlib 1.2.11 然后你用wget http://www.zlib.net/zlib 1.2.11或者wget http://www.zlib.net/zlib-1.2.11下载,那你永远下载不了. 嘿嘿,正确的下载方式是wget http://www.zlib.net/zlib-1.2.11.tar.gz 进入…

Java多线程(详细了解java多线程机制)

每天进步一点点 一、程序、进程、线程1.1 什么是程序1.2 什么是进程1.3 什么是线程1.4 进程和线程的区别 二、创建线程的三种方式2.1 继承Thread类重写run()方法具体实现获取线程ID和名称修改线程名称 2.2 实现Runnable接口实现run()方法具体实现使用匿名内部类 2.3 实现Callab…

JAVA多线程和并发编程(三)- JAVA多线程信息共享

我们通常希望多个线程之间有信息的通信&#xff0c;而不是每个线程各自run方法执行完就结束了。那么多个线程间如何通信呢&#xff1f; Java中多线程通常通过共享变量进行信息共享。 1&#xff09;使用static变量共享信息&#xff0c;该方法适用于通过继承Thread类创建线程的方…

Java多线程的知识点

&#x1f331;&#x1f331;友友们大家好 我是你们的小王同学啊 今天给大家带来的是 java多线程的知识点 希望大家能支持小王 喜欢就给个三连吧 你们的三连是我制作的动力&#xff01;&#x1f497;&#x1f497; 小王的gitee&#xff1a;小王同学&#x1f370; 小王的github&a…

java线程调度

线程调度分为两种形式 1 分时调度模型: 所有线程轮流获得CPU使用权&#xff0c;平均分配每一个线程的CPU时间片 2 抢占式调度模型: 优先让优先级更高的线程使用CPU&#xff0c;如果线程优先级相同 那机会随机分配优先级 给优先级高的线程更多一些的时间片 而java的分配模式 是…

java多线程(详)

目录 一,什么叫线程&#xff1f; 那我们要先了解什么叫进程&#xff0c;线程依赖于进程而存在的。 二.多线程的创建 方式一&#xff1a;继承Thread类 方式二&#xff1a;实现Runnable接口 方式三&#xff1a;JDK 5.0新增&#xff1a;实现Callable接口 三种方式的比…

Java线程、Java多线程详细介绍

目录 一、进程和线程的区别 1.1 进程 1.2 线程 二、并发和并行 2.1 并行 2.2 并发 2.3 监控线程的执行情况 三、创建方式 3.1 继承Thread类 思考&#xff1a;为什么不直接通过对象调用start&#xff08;&#xff09;方法&#xff1f; 3.2 实现Runnable接口 …