溫馨提示×

Linux下C++代碼如何壓縮

小樊
93
2025-03-04 22:40:38
欄目: 編程語言

在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++代碼對文件或數據進行壓縮。根據具體需求,可以選擇合適的壓縮庫和方法。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女