zlib使用教程

article/2025/10/9 12:27:16
  1. 下载zlib
    http://www.zlib.net/
    这里写图片描述
  2. 编译zlib库
    打开sln: zlib-1.2.11\contrib\vstudio\vc12\zlibvc.sln
    这里写图片描述
    生成库位置:
    zlib-1.2.11\contrib\vstudio\vc12\x86\ZlibDllRelease
    这里写图片描述
  3. 调用zlib库
    添加lib依赖库位置:zlibwapi.lib的文件位置
    这里写图片描述
    添加zlibwapi.lib 在附加依赖库中 键入zlibwapi.lib
    这里写图片描述
    添加include位置:
    这里写图片描述
    需要两个头文件:
    zconf.h
    zlib.h
    将其copy到一个文件夹中,然后附加到目录即可
  4. 一个例子
    一个例子:
  char text[] = "zlib compress and uncompress test\nturingo@163.com\n2012-11-05\n";char de_text[1024];uLong tlen = strlen(text) + 1;  /* 需要把字符串的结束符'\0'也一并处理 */char* buf = NULL;uLong blen;/* 计算缓冲区大小,并为其分配内存 */blen = compressBound(tlen); /* 压缩后的长度是不会超过blen的 */if ((buf = (char*)malloc(sizeof(char) * blen)) == NULL){printf("no enough memory!\n");return -1;}/* 压缩 */if (compress((Bytef *)buf, &blen, (Bytef *)text, tlen) != Z_OK){printf("compress failed!\n");return -1;}/* 解压缩 */if (uncompress((Bytef *)de_text, &tlen, (Bytef *)buf, blen) != Z_OK){printf("uncompress failed!\n");return -1;}/* 打印结果,并释放内存 */printf("%s", de_text);if (buf != NULL){free(buf);buf = NULL;}return 0;

编译
一般会出现下面的错误
这里写图片描述
加入宏定义 :ZLIB_WINAPI
这里写图片描述

注意:
compress 与uncompress这两个简单接口中的类型转换
编码长度和解码长度尽可能保证在256以下,不然容易出错

官网上的测试代码有些许问题,将其更为256

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>#include "zlib.h"void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
{R->HighPart = A.HighPart - B.HighPart;if (A.LowPart >= B.LowPart)R->LowPart = A.LowPart - B.LowPart;else{R->LowPart = A.LowPart - B.LowPart;R->HighPart --;}
}#ifdef _M_X64
// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
unsigned __int64 __rdtsc(void);
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{//   printf("rdtsc = %I64x\n",__rdtsc());pbeginTime64->QuadPart=__rdtsc();
}LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{LARGE_INTEGER LIres;unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));LIres.QuadPart=res;// printf("rdtsc = %I64x\n",__rdtsc());return LIres;
}
#else
#ifdef _M_IX86
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{DWORD dwEdx,dwEax;_asm{rdtscmov dwEax,eaxmov dwEdx,edx}pbeginTime64->LowPart=dwEax;pbeginTime64->HighPart=dwEdx;
}void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{myGetRDTSC32(pbeginTime64);
}LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{LARGE_INTEGER LIres,endTime64;myGetRDTSC32(&endTime64);LIres.LowPart=LIres.HighPart=0;MyDoMinus64(&LIres,endTime64,beginTime64);return LIres;
}
#else
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{
}void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
}LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{LARGE_INTEGER lr;lr.QuadPart=0;return lr;
}
#endif
#endifvoid BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
{if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))){pbeginTime64->LowPart = GetTickCount();pbeginTime64->HighPart = 0;}
}DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{LARGE_INTEGER endTime64,ticksPerSecond,ticks;DWORDLONG ticksShifted,tickSecShifted;DWORD dwLog=16+0;DWORD dwRet;if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))dwRet = (GetTickCount() - beginTime64.LowPart)*1;else{MyDoMinus64(&ticks,endTime64,beginTime64);QueryPerformanceFrequency(&ticksPerSecond);{ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);}dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));dwRet *=1;}return dwRet;
}int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
{FILE* stream;unsigned char* ptr;int retVal=1;stream=fopen(filename, "rb");if (stream==NULL)return 0;fseek(stream,0,SEEK_END);*plFileSize=ftell(stream);fseek(stream,0,SEEK_SET);ptr=malloc((*plFileSize)+1);if (ptr==NULL)retVal=0;else{if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))retVal=0;}fclose(stream);*pFilePtr=ptr;return retVal;
}int main(int argc, char *argv[])
{int BlockSizeCompress=256;int BlockSizeUncompress = 256;//0x8000; 注意需为256int cprLevel=Z_DEFAULT_COMPRESSION ;long lFileSize;unsigned char* FilePtr;long lBufferSizeCpr;long lBufferSizeUncpr;long lCompressedSize=0;unsigned char* CprPtr;unsigned char* UncprPtr;long lSizeCpr,lSizeUncpr;DWORD dwGetTick,dwMsecQP;LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;if (argc<=1){printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");return 0;}if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0){printf("error reading %s\n",argv[1]);return 1;}else printf("file %s read, %u bytes\n",argv[1],lFileSize);if (argc>=3)BlockSizeCompress=atol(argv[2]);if (argc>=4)BlockSizeUncompress=atol(argv[3]);if (argc>=5)cprLevel=(int)atol(argv[4]);lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;lBufferSizeUncpr = lBufferSizeCpr;CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);BeginCountPerfCounter(&li_qp,TRUE);dwGetTick=GetTickCount();BeginCountRdtsc(&li_rdtsc);{z_stream zcpr;int ret=Z_OK;long lOrigToDo = lFileSize;long lOrigDone = 0;int step=0;memset(&zcpr,0,sizeof(z_stream));deflateInit(&zcpr,cprLevel);zcpr.next_in = FilePtr;zcpr.next_out = CprPtr;do{long all_read_before = zcpr.total_in;zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);zcpr.avail_out = BlockSizeCompress;ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);lOrigDone += (zcpr.total_in-all_read_before);lOrigToDo -= (zcpr.total_in-all_read_before);step++;} while (ret==Z_OK);lSizeCpr=zcpr.total_out;deflateEnd(&zcpr);dwGetTick=GetTickCount()-dwGetTick;dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);printf("total compress size = %u, in %u step\n",lSizeCpr,step);printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);}CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);BeginCountPerfCounter(&li_qp,TRUE);dwGetTick=GetTickCount();BeginCountRdtsc(&li_rdtsc);{z_stream zcpr;int ret=Z_OK;long lOrigToDo = lSizeCpr;long lOrigDone = 0;int step=0;memset(&zcpr,0,sizeof(z_stream));inflateInit(&zcpr);zcpr.next_in = CprPtr;zcpr.next_out = UncprPtr;do{long all_read_before = zcpr.total_in;zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);zcpr.avail_out = BlockSizeUncompress;ret=inflate(&zcpr,Z_SYNC_FLUSH);lOrigDone += (zcpr.total_in-all_read_before);lOrigToDo -= (zcpr.total_in-all_read_before);step++;} while (ret==Z_OK);lSizeUncpr=zcpr.total_out;inflateEnd(&zcpr);dwGetTick=GetTickCount()-dwGetTick;dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);printf("uncpr  time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);printf("uncpr  result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);}if (lSizeUncpr==lFileSize){if (memcmp(FilePtr,UncprPtr,lFileSize)==0)printf("compare ok\n");}return 0;
}

这里,zlib只是把一段内存压缩,压缩后放的另一段内存上,这离压缩文件甚至文件夹的目标还很远

zlib介绍
zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表。zlib使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权
参考资料
CSDN博客(http://blog.csdn.net/JasonDing1354/article/details/42676685)
http://blog.csdn.net/gubenpeiyuan/article/details/8734290


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

相关文章

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…

Java多线程(超详解)

目录 1. 线程简介 1.1 程序 1.2 进程 1.3 线程 1.4 多线程 1.5 普通方法调用和多线程 2. 线程创建 2.1 继承Thread类 2.2 实现Runnable接口 2.3 实现Callable接口&#xff08;了解&#xff09; 2.4 网图下载 2.4.1 通过继承Thread类实现网图下载 2.4.2 通…

java 线程详解

一、线程的基本概念 一个程序最少需要一个进程&#xff0c;而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位&#xff0c;而进程是系统进行资源分配和调度的一个独立单位。 一个线程就是在进程中的一个单一的顺序…

JAVA多线程详解(超详细)

目录 一、线程简介1、进程、线程2、并发、并行、串行3、进程的三态 二、线程实现1、继承Thread类2、实现Runnable接口3、实现Callable接口&#xff08;不常用&#xff09; 三、线程常用方法1、线程的状态2、线程常用方法 四、多线程1、守护&#xff08;Deamon&#xff09;线程2…

Java多线程(超详细!)

1、什么是进程&#xff1f;什么是线程&#xff1f; 进程是:一个应用程序&#xff08;1个进程是一个软件&#xff09;。 线程是&#xff1a;一个进程中的执行场景/执行单元。 注意&#xff1a;一个进程可以启动多个线程。 eg. 对于java程序来说&#xff0c;当在DOS命令窗口中…