文章已经收录到我的github文档中:https://github.com/cloudQuant/cpp_little_project/tree/master/017_zlib_usage
zlib.h 是 zlib 库的头文件,zlib 是一个广泛使用的数据压缩库,提供了对数据进行压缩和解压缩的功能。 zlib 库最初由 Jean-loup Gailly 和 Mark Adler 开发,主要用于处理 gzip 格式的数据压缩。
功能
zlib.h 提供了以下主要功能:
数据压缩:将数据压缩为更小的数据块。
数据解压缩:将压缩后的数据解压缩为原始数据。
流式压缩和解压缩:支持流式处理,可以逐步压缩或解压缩数据。
内存管理:提供内存分配和释放的函数。
错误处理:提供错误码和错误信息。
主要数据结构
zlib.h 中定义了几个主要的数据结构:
z_stream:表示压缩或解压缩的流。它包含了输入和输出的缓冲区、压缩或解压缩的状态等信息。
主要函数
zlib.h 中定义了多个函数,用于压缩和解压缩数据。以下是一些常用的函数:
deflateInit:初始化压缩流。
deflate:执行压缩操作。
deflateEnd:结束压缩流。
inflateInit:初始化解压缩流。
inflate:执行解压缩操作。
inflateEnd:结束解压缩流。
compress:一次性压缩数据。
uncompress:一次性解压缩数据。
编译指令
g++ main.cpp -o main -lz
代码
#include <stdio.h> #include <string.h> #include <zlib.h> void compress_data(){ const char* input = "Hello, zlib!"; uLong input_len = strlen(input) + 1; uLong output_len = compressBound(input_len); Bytef output[output_len]; int ret = compress(output, &output_len, (const Bytef*)input, input_len); if (ret != Z_OK) { printf("Compression failed: %d\n", ret); } printf("Compressed size: %lu\n", output_len); } void uncompress_data(){ const char* input = "Hello, zlib!"; uLong input_len = strlen(input) + 1; uLong output_len = compressBound(input_len); Bytef compressed[output_len]; int ret = compress(compressed, &output_len, (const Bytef*)input, input_len); if (ret != Z_OK) { printf("Compression failed: %d\n", ret); } Bytef uncompressed[input_len]; uLong uncompressed_len = input_len; ret = uncompress(uncompressed, &uncompressed_len, compressed, output_len); if (ret != Z_OK) { printf("Decompression failed: %d\n", ret); } printf("Uncompressed data: %s\n", uncompressed); } void inflate_data(){ const char* input = "Hello, zlib!"; uLong input_len = strlen(input) + 1; uLong output_len = compressBound(input_len); Bytef output[output_len]; z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.next_in = (Bytef*)input; stream.avail_in = input_len; stream.next_out = output; stream.avail_out = output_len; int ret = deflateInit(&stream, Z_DEFAULT_COMPRESSION); if (ret != Z_OK) { printf("deflateInit failed: %d\n", ret); } ret = deflate(&stream, Z_FINISH); if (ret != Z_STREAM_END) { printf("deflate failed: %d\n", ret); deflateEnd(&stream); } deflateEnd(&stream); printf("Compressed size: %lu\n", output_len - stream.avail_out); } void deflate_data(){ const char* input = "Hello, zlib!"; uLong input_len = strlen(input) + 1; uLong output_len = compressBound(input_len); Bytef compressed[output_len]; z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.next_in = (Bytef*)input; stream.avail_in = input_len; stream.next_out = compressed; stream.avail_out = output_len; int ret = deflateInit(&stream, Z_DEFAULT_COMPRESSION); if (ret != Z_OK) { printf("deflateInit failed: %d\n", ret); } ret = deflate(&stream, Z_FINISH); if (ret != Z_STREAM_END) { printf("deflate failed: %d\n", ret); deflateEnd(&stream); } deflateEnd(&stream); Bytef uncompressed[input_len]; uLong uncompressed_len = input_len; stream.next_in = compressed; stream.avail_in = output_len - stream.avail_out; stream.next_out = uncompressed; stream.avail_out = uncompressed_len; ret = inflateInit(&stream); if (ret != Z_OK) { printf("inflateInit failed: %d\n", ret); } ret = inflate(&stream, Z_FINISH); if (ret != Z_STREAM_END) { printf("inflate failed: %d\n", ret); inflateEnd(&stream); } inflateEnd(&stream); printf("Uncompressed data: %s\n", uncompressed); } int main() { compress_data(); uncompress_data(); inflate_data(); deflate_data(); return 0; }