温馨提示×

Linux下C++代码如何压缩

小樊
42
2025-03-04 22:40:38
栏目: 编程语言
C++开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

在Linux下,C++代码可以通过多种方式进行压缩。以下是一些常见的方法和步骤:

使用Minizip库进行压缩

Minizip是一个基于zlib的压缩库,提供了丰富的API来支持多种压缩格式,包括ZIP、GZIP等。以下是使用Minizip库进行文件压缩和解压的示例代码:

#include <iostream>
#include <string>
#include <minizip/zip.h>
#include <minizip/unzip.h>

bool compressFile(const std::string& sourceFile, const std::string& zipFile) {
    zipFile_t zipfile = zipOpen(zipFile.c_str(), APPEND_STATUS_CREATE);
    if (!zipfile) {
        std::cerr << "Failed to create zip file: " << zipFile << std::endl;
        return false;
    }
    zip_fileinfo zi;
    memset(&zi, 0, sizeof(zip_fileinfo));
    if (zipOpenNewFileInZip(zipfile, sourceFile.c_str(), &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION) != ZIP_OK) {
        std::cerr << "Failed to open file in zip: " << sourceFile << std::endl;
        zipClose(zipfile, NULL);
        return false;
    }
    FILE* fin = fopen(sourceFile.c_str(), "rb");
    if (!fin) {
        std::cerr << "Failed to open source file: " << sourceFile << std::endl;
        zipCloseFileInZip(zipfile);
        zipClose(zipfile, NULL);
        return false;
    }
    char buffer[4096];
    int len;
    while ((len = fread(buffer, 1, sizeof(buffer), fin)) > 0) {
        if (zipWriteInFileInZip(zipfile, buffer, len) != ZIP_OK) {
            std::cerr << "Failed to write to zip file" << std::endl;
            fclose(fin);
            zipCloseFileInZip(zipfile);
            zipClose(zipfile, NULL);
            return false;
        }
    }
    fclose(fin);
    zipCloseFileInZip(zipfile);
    zipClose(zipfile, NULL);
    return true;
}

int main() {
    compressFile("test.txt", "test.zip");
    return 0;
}

使用zlib库进行数据压缩

zlib是一个广泛使用的压缩库,支持多种压缩格式。以下是使用zlib库进行数据压缩和解压的示例代码:

#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);
    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);
    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 = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
    std::vector<char> compressed = compressData(input);
    std::vector<char> decompressed = decompressData(compressed);
    std::cout << "Original: ";
    for (char c : input) {
        std::cout << static_cast<int>(c) << " ";
    }
    std::cout << std::endl;
    std::cout << "Compressed: " << compressed.size() << std::endl;
    std::cout << "Decompressed: ";
    for (char c : decompressed) {
        std::cout << static_cast<int>(c) << " ";
    }
    std::cout << std::endl;
    return 0;
}

编译和运行

在编译上述代码时,需要链接zlib库。例如,使用g++编译器:

g++ -o compress compress.cpp -lz
./compress

通过上述方法,你可以在Linux下使用C++代码对文件或数据进行压缩。根据具体需求,可以选择合适的压缩库和方法。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读:Linux下的C++代码如何调试

0