zlib的使用

article/2025/10/8 23:00:07

测试项目目录结构如图

在这里插入图片描述

其中zlib源文件放置在libz目录下。

将ZLib源文件编译成静态库

1.在libz-cmake目录下的CMakeLists.txt中编写如下命令,生成静态库。

cmake_minimum_required (VERSION 3.3)project (z)file (GLOB_RECURSE SOURCES ${CMAKE_SOURCE_DIR}/libz/*.c)
file (GLOB_RECURSE HEADERS ${CMAKE_SOURCE_DIR}/libz/*.h)add_library (z STATIC ${SOURCES})

2.test目录中CMakeLists.txt应该链接上述生成的静态库

cmake_minimum_required(VERSION 3.3) #版本
project(mytest)	#项目名称 :mytest
add_executable(mytest main.cpp)	#生成可执行文件
target_link_libraries(mytest z) #链接上述zlib静态库

3.test目录中main.cpp文件如下

#include <iostream>
#include <stdio.h>
#include "zlib.h"
#include "zutil.h"
#include "zconf.h"bool CompressBuf(const std::string &strSrcBuf, std::string &strDestBuf)
{unsigned long nSrcLength = static_cast<unsigned long>(strSrcBuf.length());unsigned long nDestBufLength = compressBound(nSrcLength);char *pDestBuf = new char[nDestBufLength];//初始化memset(pDestBuf, 0, nDestBufLength * sizeof(char));int ret = compress((unsigned char *)pDestBuf, &nDestBufLength, (const unsigned char *)strSrcBuf.c_str(), nSrcLength);std::cout << "after compress : " << nDestBufLength << std::endl;if (ret != Z_OK){delete[] pDestBuf;return false;}strDestBuf.append(pDestBuf, nDestBufLength);delete[] pDestBuf;return true;
}bool UncompressBuf(const std::string &strSrcBuf, std::string &strDestBuf, size_t nDestBufLength)
{char *pDestBuf = new char[nDestBufLength];memset(pDestBuf, 0, nDestBufLength * sizeof(char));int nPrevDestBufLength = nDestBufLength;int ret = uncompress((unsigned char *)pDestBuf, (unsigned long *)&nDestBufLength, (const unsigned char *)strSrcBuf.c_str(), strSrcBuf.length());if (ret != Z_OK){delete[] pDestBuf;return false;}strDestBuf.append(pDestBuf, nDestBufLength);delete[] pDestBuf;return true;
}int main(int argc, char *argv[])
{std::string str_source = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";std::cout << "str_source len : " << str_source.length() << std::endl;std::string str_destination = "";Compress(str_source, str_destination);std::cout << "str_compress len : " << str_destination.length() << std::endl;//std::cout << "str_compress : " << str_destination << std::endl;std::string origin_str = "";Uncompress(str_destination, origin_str, str_source.length());std::cout << "str_source : " << origin_str << std::endl;return 0;
}

最外层的CMakeLists.txt文件中命令如下:

cmake_minimum_required (VERSION 3.3)
project (test_zlib)
include_directories (${PROJECT_SOURCE_DIR}/libz)
include_directories (${PROJECT_SOURCE_DIR}/test)
add_subdirectory(libz-cmake)
add_subdirectory(test)

对于zlib的compress函数,定义如下:

int ZEXPORT compress(unsigned char *dest, unsigned long *destLen, const unsigned char *source, unsigned long sourceLen);

第一个参数:目标buffer,即压缩之后要放入的空间

第二个参数:目标buffer的大小,此处如果小于被压缩数据的长度,该函数会返回Z_BUF_ERROR(-5),所以正确做法如demo中所示:

unsigned long dest_buff_len = compressBound(src_len);

利用compressBound()函数,传入源数据长度,会计算出一个安全边界大小dest_buff_len,将dest_buff_len作为compress()函数第二个参数,传入其地址(compress内部会更改其大小)。

第三个参数:源数据buffer

第四个参数:源数据大小

对于zlib的uncompress函数,定义如下:

int ZEXPORT uncompress(unsigned char *dest,unsigned long *destLen,const unsigned char *source,unsigned long sourceLen)

第一个参数:即解压之后要放入的空间。

对于目标缓冲区,其大小应当大于源数据(即没有压缩之前的数据)空间大小,否则会Z_BUF_ERROR,而太大了,又会浪费空间,所以应当保存一下源数据的空间大小。

第二个参数:即放入空间的大小

第三个参数:要进行解压的数据

第四个参数:要进行解压的数据大小


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

相关文章

【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接口 …

【java】java多线程及线程池详解

目录 前言线程是什么&#xff1f;多线程是什么&#xff1f;多线程的作用和好处以及缺点守护线程和用户线程并发和并行的区别 一.线程的状态和常用方法1.线程各种状态转化图2.线程相关常用方法有① wait()② sleep(long timeout)③ join()④ yield()⑤ notify()和notifyAll() 3.…

Java线程池(超详细)

文章目录 1. 线程池概念2. JUC线程池架构3. Executors创建线程的4种方法4. 线程池的标准创建方式5. 向线程池提交任务的两种方式6. 线程池的任务调度流程7. ThreadFactory&#xff08;线程工厂&#xff09;8. 任务阻塞队列9. 调度器的钩子方法10. 线程池的拒绝策略11. 线程池的…

Java多线程超详解

引言 随着计算机的配置越来越高&#xff0c;我们需要将进程进一步优化&#xff0c;细分为线程&#xff0c;充分提高图形化界面的多线程的开发。这就要求对线程的掌握很彻底。 那么话不多说&#xff0c;今天本帅将记录自己线程的学习。 程序&#xff0c;进程&#xff0c;线程的…

java多线程(超详细)

1 - 线程 1.1 - 进程 进程就是正在运行中的程序&#xff08;进程是驻留在内存中的&#xff09; 是系统执行资源分配和调度的独立单位 每一进程都有属于自己的存储空间和系统资源 注意&#xff1a;进程A和进程B的内存独立不共享。 1.2 - 线程 线程就是进程中的单个顺序控制…

JAVA线程

一、线程相关概念 &#xff08;一&#xff09;程序、进程和线程的区别 程序 程序是含有指令和数据的文件&#xff0c;被存储在磁盘或其他的数据存储设备中&#xff0c;也就是说程序是静态的代码。 进程 进程是程序的一次执行过程&#xff0c;是系统运行的基本单位&#xf…

Java 线程 基础知识总结

线程基础 很不严谨的说&#xff0c;线程是什么&#xff1f;线程就是为了让很多个东西并发执行&#xff0c;大大的提高程序执行的效率啊 三个非常重要的概念&#xff1a; 程序&#xff1a;一组写好了的静态代码块&#xff08;就我们写的那些代码玩意&#xff09;进程&#xf…