温馨提示×

Linux下C++代码如何压缩

小樊
104
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