C++内嵌代码使用压缩的方法(compress和uncompress函数)需要有zlib,编译时加-lz

本文介绍了zlib库中的compress和uncompress函数,详细解释了如何使用这两个函数进行内存数据的压缩和解压缩,包括参数说明及错误处理。通过一个简单的C++示例程序演示了压缩和解压缩的过程。

转自:http://blog.youkuaiyun.com/Solstice/archive/2003/04/04/2061.aspx

以下全文转:

使用zlib库里的compress函数与uncompress函数

zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)zlib 也支持读写 gzip (.gz) 格式的文件。下面介绍两个最有用的函数——compress uncompress

 

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen表示 dest 缓冲区的大小,destLen > (sourceLen + 12)*100.1%。当函数退出后,destLen 表示压缩后缓冲区的实际大小。此时 destLen / sourceLen 正好是压缩率。

compress 若成功,则返回 Z_OK;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR

 

int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。

uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR

zlib 带的 example.c 是个很好的学习范例,值得一观。我们写个程序,验证 zlib 的压缩功能。所写的测试程序保存为 testzlib.cpp ,放在 zlib-1.1.4 目录下。程序源代码:

// testzlib.cpp  简单测试 zlib 的压缩功能

#include <cstring>

#include <cstdlib>

#include <iostream>

#include "zlib.h"

 

using namespace std;

 

int main()

{

    int err;

    Byte compr[200], uncompr[200];    // big enough

    uLong comprLen, uncomprLen;

    const char* hello = "12345678901234567890123456789012345678901234567890";

 

    uLong len = strlen(hello) + 1;

    comprLen  = sizeof(compr) / sizeof(compr[0]);

 

    err = compress(compr, &comprLen, (const Bytef*)hello, len);

 

    if (err != Z_OK) {

        cerr << "compess error: " << err << '/n';

        exit(1);

    }

    cout << "orignal size: " << len

         << " , compressed size : " << comprLen << '/n';

 

    strcpy((char*)uncompr, "garbage");

 

    err = uncompress(uncompr, &uncomprLen, compr, comprLen);

 

    if (err != Z_OK) {

        cerr << "uncompess error: " << err << '/n';

        exit(1);

    }

    cout << "orignal size: " << len

         << " , uncompressed size : " << uncomprLen << '/n';

 

    if (strcmp((char*)uncompr, hello)) {

        cerr << "BAD uncompress!!!/n";

        exit(1);

    } else {

        cout << "uncompress() succeed: /n" << (char *)uncompr;

    }

}

编译执行这个程序,输出应该是

D:/libpng/zlib-1.1.4>bcc32 testzlib.cpp zlib.lib

 

D:/libpng/zlib-1.1.4>testzlib

orignal size: 51 , compressed size : 22

orignal size: 51 , uncompressed size : 51

uncompress() succeed:

12345678901234567890123456789012345678901234567890

 

 
PS:这两个函数的一个很好的用处便是当需要将一个很占内存的变量写入文件以节省内存时,可以先压缩一下,然后写入文件,当需要使用时再从文件中读出,然后解压缩,以便节省IO时间。此外,有些情况可能还要序列化一下,当要压缩的内存不是一段连续的内存的时候。

<think>我们正在讨论zlib-flate工具的使用,特别是-uncompress-compress参数的功能。根据引用内容,我们知道zlib是一个通用的压缩库,提供in-memory压缩解压函数。而zlib-flate是一个命令行工具,用于处理zlib格式的数据。用户询问zlib-flate工具的使用方法,特别是-uncompress-compress参数。首先,我们需要明确zlib-flate的基本用法:该工具通常用于对zlib格式的数据进行压缩压缩操作。参数说明:-compress:用于压缩输入数据,输出为zlib格式的压缩数据。-uncompress:用于解压缩输入数据(输入应为zlib格式的压缩数据),输出为原始数据。使用格式可能如下:压缩zlib-flate-compress<input_file>output_file解压缩zlib-flate-uncompress<input_file>output_file注意:输入输出通常通过标准输入标准输出进行,因此我们可以使用重定向。另外,根据引用[2],zlib格式gzip格式是不同的,不能混用。zlib-flate处理的是zlib格式,而不是gzip格式。因此,在回答中我们需要强调这一点,避免用户误用。同时,根据引用[3][4],我们也可以了解到在编程中如何使用zlib库进行压缩压缩,但用户目前的问题是关于命令行工具,所以我们主要回答命令行工具的使用。我们将按照以下结构回答:1.介绍zlib-flate工具的基本用途。2.详细说明-compress-uncompress参数的功能使用方法。3.给出具体的使用示例。4.提醒用户注意zlib格式与其他格式(如gzip)的区别。最后,根据指令,我们需要生成相关问题。</think>### zlib-flate 工具使用指南 `zlib-flate` 是 zlib 库提供的命令行工具,用于直接处理 zlib 格式的压缩数据。以下是核心参数的功能说明: #### 1. **`-compress` 参数** - **功能**:将原始数据压缩zlib 格式 - **使用场景**:替代 `gzip` 生成纯 zlib 格式(无 gzip 头尾) - **语法示例**: ```bash # 压缩文件(输出到 stdout) zlib-flate -compress < input.txt > output.zlib # 压缩字符串(需先写入文件) echo "原始数据" > input.txt zlib-flate -compress < input.txt > compressed.zlib ``` - **关键特性**: - 输出格式符合 RFC 1950 标准[^2] - 压缩级别可通过环境变量 `ZLIB_LEVEL` 控制(0-9,默认6)[^5] #### 2. **`-uncompress` 参数** - **功能**:解压缩 zlib 格式数据 - **使用场景**:解压由 `-compress` 或程序生成的 zlib 数据 - **语法示例**: ```bash # 解压文件(输出到 stdout) zlib-flate -uncompress < compressed.zlib > restored.txt # 验证数据完整性(自动校验 Adler-32 校验)[^1] zlib-flate -uncompress < damaged.zlib # 校验失败时报错 ``` - **关键特性**: - 自动验证数据完整性(integrity)[^1] - 仅支持标准 zlib 格式(与 gzip 不兼容)[^2] #### 注意事项: 1. **格式兼容性**: - zlib 格式 ≠ gzip 格式[^2],不能与 `gzip` 命令混用 - 编程时需对应使用 `compress`/`uncompress` 函数(非 `gz*` 系列)[^2][^4] 2. **性能权衡**: - zlib 压缩在速度/压缩率间较平衡[^3],适合需要高效内存操作的场景 3. **输入输出**: - 默认从 `stdin` 读取,输出到 `stdout` - 二进制敏感:处理非文本时需用 `-raw` 参数 > 示例工作流: > ```bash > # 压缩并验证 > echo "测试数据" > orig.txt > zlib-flate -compress < orig.txt > test.zlib > zlib-flate -uncompress < test.zlib # 应输出"测试数据" > ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值