0

0

C++如何压缩和解压文件?(zlib库使用指南)

冰火之心

冰火之心

发布时间:2026-02-24 15:48:10

|

454人浏览过

|

来源于php中文网

原创

zlib的compress/uncompress仅处理内存数据,不支持文件i/o;生成zip需用minizip或zlib-ng;windowbits参数决定格式兼容性;缓冲区须用malloc/free统一管理。

c++如何压缩和解压文件?(zlib库使用指南)

zlib 的 compressuncompress 只能处理内存数据,不能直接读写文件

这是最常踩的坑:看到函数名带“compress”,就以为能传个 "input.txt" 进去直接生成 "output.zip"。实际上 compressuncompress 是 zlib 最底层的 DEFLATE 压缩/解压函数,只操作 unsigned char* 缓冲区,不碰文件 I/O。

真正要压缩文件,得自己:
- 用 fopen 读取原始文件到内存(或分块读)
- 调用 compress 处理这块内存
- 再用 fwrite 把结果写入新文件
- 解压同理,但要注意目标缓冲区大小必须足够——uncompress 不会自动扩容,给小了就返回 Z_BUF_ERROR

示例关键片段:

unsigned long destLen = sourceLen * 1.1 + 12; // 预估压缩后大小,+12 是 zlib header 开销
unsigned char* dest = new unsigned char[destLen];
int ret = compress(dest, &destLen, source, sourceLen); // 注意 destLen 是引用传入,会被改写

想生成 .zip 文件?别用 zlib 原生 API,改用 minizip 或 zlib-ng 的 zipOpen

标准 zlib 库根本不提供 ZIP 归档功能——它只实现 DEFLATE 算法。所谓“zip 文件”是 ZIP 格式(含目录结构、文件头、CRC、中央目录等),zlib 自带的 contrib/minizip 才封装了这部分逻辑。

如果你硬要用原生 zlib 拼 ZIP,等于重写 ZIP 规范解析器,极易出错。实际项目中建议:

立即学习C++免费学习笔记(深入)”;

  • minizip(zlib 源码包里自带,需自己编译启用)
  • 或者直接切到更现代的 zlib-ng,它把 zipOpen/zipWriteInFileInZip 等接口整理得更清晰
  • Windows 下可考虑 7z.dlllibzip,它们对多文件、密码、UTF-8 路径支持更稳

注意:minizip 默认不支持 ZIP64,大文件(>4GB)需定义 ZIP_USE_ZIP64 宏并确保调用链全量启用。

deflateInit2 的 windowBits 参数决定兼容性和格式,设错就打不开

这个参数控制 DEFLATE 的窗口大小和封装格式,直接影响输出能否被其他工具识别:

  • windowBits = 15:标准 DEFLATE 流(无头尾),gzipPython zlib.decompress 都能解,但 WinRAR / 7-Zip 默认不认
  • windowBits = -15:DEFLATE 流(负号表示去掉 zlib header/trailer),适合嵌入协议载荷
  • windowBits = 31:gzip 格式(RFC 1952),带 magic header 和 CRC,gunzip、浏览器 fetch().then(r => r.arrayBuffer()) 都能直解

常见错误:用 deflateInit2(..., 15, ...) 压出数据,然后拿 gzip -d 去解——失败,因为 gzip 工具只认 windowBits=31 生成的流。反过来,用 31 压的流,若用 uncompress()(只认 zlib 格式)去解,也会报 Z_DATA_ERROR

内存管理不匹配导致崩溃:malloc/free 和 new/delete 别混用

zlib 函数内部不管理用户传入的缓冲区内存,但很多示例代码忽略了分配方式一致性:

  • compressuncompress 的输入/输出缓冲区必须用 malloc 分配(zlib 内部可能调用 realloc
  • 如果用了 new unsigned char[],再传给 uncompress,而它内部又尝试 free() 释放——未定义行为,大概率 crash
  • deflate/inflate 结构体里的 zalloc/zfree 回调也必须匹配:若用 new 分配 z_stream,回调里就得用 delete,否则泄漏

最省心做法:所有 zlib 相关缓冲区统一走 malloc/freez_stream 实例本身用栈分配(z_stream stream;),避免手动管理。

复杂点在于跨平台时 malloc 对齐要求不同,尤其 ARM64 上某些 zlib 版本对未对齐指针敏感——建议用 aligned_alloc(C11)或 _aligned_malloc(MSVC)分配 >1KB 的缓冲区。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

365

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

200

2025.07.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1630

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

485

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2304

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

40

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

422

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

595

2023.08.10

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

1

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.1万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号