C++ 中使用 Zlib 的详细教程
Zlib 是一个用于压缩和解压缩数据的开源库,它提供了对 gzip 和 deflate 的支持。它常用于数据压缩与解压缩,特别是在处理文件和网络传输时。以下是 Zlib 的详细教程,介绍如何在 C++ 中使用该库进行压缩和解压缩操作。
你可以从 Zlib 的官方网站下载最新的版本:Zlib 下载。
也可以通过包管理器来安装,例如:
sudo apt-get install zlib1g-dev
vcpkg install zlib
brew install zlib
Linux/macOS:如果你使用 g++,可以通过添加 -lz 参数来链接 Zlib 库:
g++ main.cpp -lz -o program
Windows:确保库的路径已正确配置,在项目属性中设置 Zlib 的包含路径和库路径,或者在 CMake 中通过 find_package(ZLIB REQUIRED) 来自动查找和配置。
Zlib 提供了几个主要的功能:
compress 和 uncompress:用于简单的内存压缩和解压缩。
deflate 和 inflate:更高级的压缩和解压缩接口,可以处理分块数据。
Zlib 提供了 compress() 函数进行压缩,uncompress() 函数进行解压缩。
#include
#include // 包含 Zlib 头文件
int main() {
// 原始数据
const char* data = "Hello, Zlib!";
uLong data_len = strlen(data) + 1; // 包含末尾的 '\0'
// 估计压缩后的缓冲区大小(通常比原数据大一点)
uLong compressed_len = compressBound(data_len);
Bytef* compressed_data = new Bytef[compressed_len];
// 压缩数据
int res = compress(compressed_data, &compressed_len, (const Bytef*)data, data_len);
if (res != Z_OK) {
std::cerr << "压缩失败!错误码:" << res << std::endl;
delete[] compressed_data;
return 1;
}
std::cout << "压缩后的大小: " << compressed_len << " 字节" << std::endl;
// 解压缩数据
Bytef* uncompressed_data = new Bytef[data_len];
uLong uncompressed_len = data_len;
res = uncompress(uncompressed_data, &uncompressed_len, compressed_data, compressed_len);
if (res != Z_OK) {
std::cerr << "解压缩失败!错误码:" << res << std::endl;
delete[] compressed_data;
delete[] uncompressed_data;
return 1;
}
std::cout << "解压缩后的数据: " << uncompressed_data << std::endl;
// 释放内存
delete[] compressed_data;
delete[] uncompressed_data;
return 0;
}
compress() 函数:
int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
dest: 压缩后的数据缓冲区。
destLen: 输入时为缓冲区大小,输出时为压缩后的大小。
source: 要压缩的数据缓冲区。
sourceLen: 原始数据大小。
uncompress() 函数:
int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
dest: 解压后的数据缓冲区。
destLen: 输入时为缓冲区大小,输出时为解压后的大小。
source: 压缩的数据缓冲区。
sourceLen: 压缩数据大小。
deflate() 和 inflate() 提供了更灵活的接口,允许处理大块数据,分块压缩和解压。
#include
#include
int main() {
// 原始数据
const char* data = "Hello, Zlib with deflate!";
uLong data_len = strlen(data) + 1;
// 初始化 z_stream 结构
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
// 初始化 deflate 操作
if (deflateInit(&stream, Z_BEST_COMPRESSION) != Z_OK) {
std::cerr << "deflate 初始化失败!" << std::endl;
return 1;
}
// 设置输入数据
stream.next_in = (Bytef*)data;
stream.avail_in = data_len;
// 设置输出缓冲区
Bytef compressed_data[100];
stream.next_out = compressed_data;
stream.avail_out = sizeof(compressed_data);
// 开始压缩
if (deflate(&stream, Z_FINISH) != Z_STREAM_END) {
std::cerr << "deflate 压缩失败!" << std::endl;
deflateEnd(&stream);
return 1;
}
// 计算压缩后的大小
uLong compressed_len = stream.total_out;
std::cout << "deflate 压缩后的大小: " << compressed_len << " 字节" << std::endl;
// 清理
deflateEnd(&stream);
return 0;
}
#include
#include
int main() {
// 压缩的数据(前面示例中生成的)
Bytef compressed_data[100] = { /* some compressed data */ };
uLong compressed_len = sizeof(compressed_data);
// 初始化 z_stream 结构
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
// 初始化 inflate 操作
if (inflateInit(&stream) != Z_OK) {
std::cerr << "inflate 初始化失败!" << std::endl;
return 1;
}
// 设置输入数据
stream.next_in = compressed_data;
stream.avail_in = compressed_len;
// 设置输出缓冲区
Bytef uncompressed_data[100];
stream.next_out = uncompressed_data;
stream.avail_out = sizeof(uncompressed_data);
// 开始解压
if (inflate(&stream, Z_FINISH) != Z_STREAM_END) {
std::cerr << "inflate 解压失败!" << std::endl;
inflateEnd(&stream);
return 1;
}
// 计算解压后的大小
uLong uncompressed_len = stream.total_out;
std::cout << "inflate 解压后的数据: " << uncompressed_data << std::endl;
std::cout << "解压后的大小: " << uncompressed_len << " 字节" << std::endl;
// 清理
inflateEnd(&stream);
return 0;
}
Zlib 函数返回值用来标识操作是否成功:
简单使用:compress 和 uncompress 是简单压缩和解压缩的 API,用于小数据块处理。
高级控制:deflate 和 inflate 提供更灵活的压缩/解压缩接口,适合处理大块数据或流式数据。
Zlib 具有高效的压缩率和处理速度,是非常流行的压缩库,适用于网络传输、文件存储等场景。