cpp中zlib.h的介绍和使用
作者:yunjinqi   类别:    日期:2024-10-08 17:05:15    阅读:189 次   消耗积分:0 分    

文章已经收录到我的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;
}


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/396
上一篇:pybind文档1:如何安装pybind11
下一篇:cpp蒙特卡洛计算23个人中至少有两个生日是同一天的概率?