在Linux下,C++代碼可以通過多種方式進行壓縮。以下是一些常見的方法和步驟:
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庫進行數據壓縮和解壓的示例代碼:
#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++代碼對文件或數據進行壓縮。根據具體需求,可以選擇合適的壓縮庫和方法。