在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++代码对文件或数据进行压缩。根据具体需求,可以选择合适的压缩库和方法。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
推荐阅读:Linux下的C++代码如何调试