Linux C++开发中如何进行数据压缩解压

发布时间:2024-12-16 22:57:18 作者:小樊
来源:亿速云 阅读:78

在 Linux 系统下进行 C++ 数据压缩和解压,你可以使用一些常用的库,如 zlib、bzip2 和 libarchive 等

  1. 使用 zlib 库进行数据压缩和解压:

首先,你需要安装 zlib 库。在 Ubuntu 或 Debian 系统下,可以使用以下命令安装:

sudo apt-get install zlib1g-dev

接下来,你可以使用以下示例代码进行压缩和解压操作:

#include <iostream>
#include <vector>
#include <zlib.h>

// 压缩数据
std::vector<char> compressData(const std::vector<char>& input) {
    z_stream zs;
    zs.zalloc = Z_NULL;
    zs.zfree = Z_NULL;
    zs.opaque = Z_NULL;
    deflateInit(&zs, Z_BEST_COMPRESSION);

    std::vector<char> output(input.size() * 1.1 + 12);
    zs.next_in = reinterpret_cast<Bytef*>(input.data());
    zs.avail_in = static_cast<uInt>(input.size());
    zs.next_out = reinterpret_cast<Bytef*>(output.data());
    zs.avail_out = static_cast<uInt>(output.size());

    deflate(&zs, Z_FINISH);
    deflateEnd(&zs);

    output.resize(zs.total_out);
    return output;
}

// 解压数据
std::vector<char> decompressData(const std::vector<char>& input) {
    z_stream zs;
    zs.zalloc = Z_NULL;
    zs.zfree = Z_NULL;
    zs.opaque = Z_NULL;
    inflateInit(&zs);

    std::vector<char> output(input.size() * 1.1 + 12);
    zs.next_in = reinterpret_cast<Bytef*>(input.data());
    zs.avail_in = static_cast<uInt>(input.size());
    zs.next_out = reinterpret_cast<Bytef*>(output.data());
    zs.avail_out = static_cast<uInt>(output.size());

    inflate(&zs, Z_FINISH);
    inflateEnd(&zs);

    output.resize(zs.total_out);
    return output;
}

int main() {
    std::vector<char> input = "Hello, world!";
    std::vector<char> compressed = compressData(input);
    std::vector<char> decompressed = decompressData(compressed);

    std::cout << "Original: " << input << std::endl;
    std::cout << "Compressed: " << compressed.size() << std::endl;
    std::cout << "Decompressed: " << decompressed << std::endl;

    return 0;
}
  1. 使用 bzip2 库进行数据压缩和解压:

首先,你需要安装 bzip2 库。在 Ubuntu 或 Debian 系统下,可以使用以下命令安装:

sudo apt-get install libbz2-dev

接下来,你可以使用以下示例代码进行压缩和解压操作:

#include <iostream>
#include <vector>
#include <bzlib.h>

// 压缩数据
std::vector<char> compressData(const std::vector<char>& input) {
    std::vector<char> output;
    output.reserve(input.size() * 1.1 + 12);

    bz_stream bz;
    bz.bzalloc = nullptr;
    bz.bzfree = nullptr;
    bz.opaque = nullptr;
    bz.avail_in = 0;
    bz.next_in = nullptr;

    if (BZ_OK != BZ2_compressInit(&bz, 9)) {
        return output;
    }

    size_t inputSize = input.size();
    for (size_t i = 0; i < inputSize; ++i) {
        bz.next_in = reinterpret_cast<const char*>(&input[i]);
        bz.avail_in = 1;

        do {
            bz.avail_out = output.size() - output.size() % 16;
            bz.next_out = reinterpret_cast<char*>(&output[output.size() - bz.avail_out]);

            int ret = BZ2_compress(&bz, BZ_FINISH);
            if (ret != BZ_STREAM_END) {
                output.resize(output.size() + (16 - bz.avail_out));
            }
        } while (ret != BZ_STREAM_END);
    }

    bz2_compressEnd(&bz);

    return output;
}

// 解压数据
std::vector<char> decompressData(const std::vector<char>& input) {
    std::vector<char> output;
    output.reserve(input.size() * 1.1 + 12);

    bz_stream bz;
    bz.bzalloc = nullptr;
    bz.bzfree = nullptr;
    bz.opaque = nullptr;
    bz.avail_in = 0;
    bz.next_in = nullptr;

    if (BZ_OK != BZ2_decompressInit(&bz)) {
        return output;
    }

    size_t inputSize = input.size();
    for (size_t i = 0; i < inputSize; ++i) {
        bz.next_in = reinterpret_cast<const char*>(&input[i]);
        bz.avail_in = 1;

        do {
            bz.avail_out = output.size() - output.size() % 16;
            bz.next_out = reinterpret_cast<char*>(&output[output.size() - bz.avail_out]);

            int ret = BZ2_decompress(&bz);
            if (ret != BZ_OK) {
                return output;
            }
        } while (bz.avail_out == 0);
    }

    bz2_decompressEnd(&bz);

    return output;
}

int main() {
    std::vector<char> input = "Hello, world!";
    std::vector<char> compressed = compressData(input);
    std::vector<char> decompressed = decompressData(compressed);

    std::cout << "Original: " << input << std::endl;
    std::cout << "Compressed: " << compressed.size() << std::endl;
    std::cout << "Decompressed: " << decompressed << std::endl;

    return 0;
}
  1. 使用 libarchive 库进行数据压缩和解压:

首先,你需要安装 libarchive 库。在 Ubuntu 或 Debian 系统下,可以使用以下命令安装:

sudo apt-get install libarchive-dev

接下来,你可以使用以下示例代码进行压缩和解压操作:

#include <iostream>
#include <vector>
#include <archive/archive.h>
#include <archive/entry.h>

// 压缩数据
std::vector<char> compressData(const std::vector<char>& input) {
    std::vector<char> output;
    output.reserve(input.size() * 1.1 + 12);

    struct archive* a = archive_write_new();
    archive_write_set_format(a, ARCHIVE_FORMAT_TAR);
    archive_write_open(&a, nullptr, nullptr, nullptr, nullptr);

    archive_entry* entry = archive_entry_new();
    archive_entry_set_size(entry, input.size());
    archive_entry_set_mtime(entry, time(nullptr), 0);
    archive_entry_set_mode(entry, 0644);
    archive_entry_set_type(entry, archive_entry_type_regular);
    archive_entry_set_pathname(entry, "data");
    archive_write_header(a, entry);

    archive_write_data(a, input.data(), input.size());
    archive_entry_free(entry);
    archive_write_close(a);
    archive_free(a);

    return output;
}

// 解压数据
std::vector<char> decompressData(const std::vector<char>& input) {
    std::vector<char> output;
    output.reserve(input.size() * 1.1 + 12);

    struct archive* a = archive_read_new();
    archive_read_support_filter_all(a);
    archive_read_support_format_all(a);

    if (archive_read_open(&a, input.data(), input.size(), nullptr) != ARCHIVE_OK) {
        return output;
    }

    struct archive_entry* entry;
    while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
        archive_entry_data(entry, &output[output.size() - archive_entry_size(entry)]);
        archive_entry_free(entry);
    }

    archive_read_close(a);
    archive_free(a);

    return output;
}

int main() {
    std::vector<char> input = "Hello, world!";
    std::vector<char> compressed = compressData(input);
    std::vector<char> decompressed = decompressData(compressed);

    std::cout << "Original: " << input << std::endl;
    std::cout << "Compressed: " << compressed.size() << std::endl;
    std::cout << "Decompressed: " << decompressed << std::endl;

    return 0;
}

这些示例代码展示了如何使用 zlib、bzip2 和 libarchive 库在 Linux 系统下进行 C++ 数据压缩和解压。你可以根据自己的需求选择合适的库进行操作。

推荐阅读:
  1. Linux C++开发中如何进行数据智能压缩
  2. Linux C++开发中如何进行数据加密

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux

上一篇:如何在Linux下使用C++进行数据预处理

下一篇:C++在Linux机器人技术中的应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》