在 Linux 系统下进行 C++ 数据压缩和解压,你可以使用一些常用的库,如 zlib、bzip2 和 libarchive 等
首先,你需要安装 zlib 库。在 Ubuntu 或 Debian 系统下,可以使用以下命令安装:
sudo apt-get install zlib1g-dev
接下来,你可以使用以下示例代码进行压缩和解压操作:
#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 + 12);
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 + 12);
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 = "Hello, world!";
std::vector<char> compressed = compressData(input);
std::vector<char> decompressed = decompressData(compressed);
std::cout << "Original: " << input << std::endl;
std::cout << "Compressed: " << compressed.size() << std::endl;
std::cout << "Decompressed: " << decompressed << std::endl;
return 0;
}
首先,你需要安装 bzip2 库。在 Ubuntu 或 Debian 系统下,可以使用以下命令安装:
sudo apt-get install libbz2-dev
接下来,你可以使用以下示例代码进行压缩和解压操作:
#include <iostream>
#include <vector>
#include <bzlib.h>
// 压缩数据
std::vector<char> compressData(const std::vector<char>& input) {
std::vector<char> output;
output.reserve(input.size() * 1.1 + 12);
bz_stream bz;
bz.bzalloc = nullptr;
bz.bzfree = nullptr;
bz.opaque = nullptr;
bz.avail_in = 0;
bz.next_in = nullptr;
if (BZ_OK != BZ2_compressInit(&bz, 9)) {
return output;
}
size_t inputSize = input.size();
for (size_t i = 0; i < inputSize; ++i) {
bz.next_in = reinterpret_cast<const char*>(&input[i]);
bz.avail_in = 1;
do {
bz.avail_out = output.size() - output.size() % 16;
bz.next_out = reinterpret_cast<char*>(&output[output.size() - bz.avail_out]);
int ret = BZ2_compress(&bz, BZ_FINISH);
if (ret != BZ_STREAM_END) {
output.resize(output.size() + (16 - bz.avail_out));
}
} while (ret != BZ_STREAM_END);
}
bz2_compressEnd(&bz);
return output;
}
// 解压数据
std::vector<char> decompressData(const std::vector<char>& input) {
std::vector<char> output;
output.reserve(input.size() * 1.1 + 12);
bz_stream bz;
bz.bzalloc = nullptr;
bz.bzfree = nullptr;
bz.opaque = nullptr;
bz.avail_in = 0;
bz.next_in = nullptr;
if (BZ_OK != BZ2_decompressInit(&bz)) {
return output;
}
size_t inputSize = input.size();
for (size_t i = 0; i < inputSize; ++i) {
bz.next_in = reinterpret_cast<const char*>(&input[i]);
bz.avail_in = 1;
do {
bz.avail_out = output.size() - output.size() % 16;
bz.next_out = reinterpret_cast<char*>(&output[output.size() - bz.avail_out]);
int ret = BZ2_decompress(&bz);
if (ret != BZ_OK) {
return output;
}
} while (bz.avail_out == 0);
}
bz2_decompressEnd(&bz);
return output;
}
int main() {
std::vector<char> input = "Hello, world!";
std::vector<char> compressed = compressData(input);
std::vector<char> decompressed = decompressData(compressed);
std::cout << "Original: " << input << std::endl;
std::cout << "Compressed: " << compressed.size() << std::endl;
std::cout << "Decompressed: " << decompressed << std::endl;
return 0;
}
首先,你需要安装 libarchive 库。在 Ubuntu 或 Debian 系统下,可以使用以下命令安装:
sudo apt-get install libarchive-dev
接下来,你可以使用以下示例代码进行压缩和解压操作:
#include <iostream>
#include <vector>
#include <archive/archive.h>
#include <archive/entry.h>
// 压缩数据
std::vector<char> compressData(const std::vector<char>& input) {
std::vector<char> output;
output.reserve(input.size() * 1.1 + 12);
struct archive* a = archive_write_new();
archive_write_set_format(a, ARCHIVE_FORMAT_TAR);
archive_write_open(&a, nullptr, nullptr, nullptr, nullptr);
archive_entry* entry = archive_entry_new();
archive_entry_set_size(entry, input.size());
archive_entry_set_mtime(entry, time(nullptr), 0);
archive_entry_set_mode(entry, 0644);
archive_entry_set_type(entry, archive_entry_type_regular);
archive_entry_set_pathname(entry, "data");
archive_write_header(a, entry);
archive_write_data(a, input.data(), input.size());
archive_entry_free(entry);
archive_write_close(a);
archive_free(a);
return output;
}
// 解压数据
std::vector<char> decompressData(const std::vector<char>& input) {
std::vector<char> output;
output.reserve(input.size() * 1.1 + 12);
struct archive* a = archive_read_new();
archive_read_support_filter_all(a);
archive_read_support_format_all(a);
if (archive_read_open(&a, input.data(), input.size(), nullptr) != ARCHIVE_OK) {
return output;
}
struct archive_entry* entry;
while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
archive_entry_data(entry, &output[output.size() - archive_entry_size(entry)]);
archive_entry_free(entry);
}
archive_read_close(a);
archive_free(a);
return output;
}
int main() {
std::vector<char> input = "Hello, world!";
std::vector<char> compressed = compressData(input);
std::vector<char> decompressed = decompressData(compressed);
std::cout << "Original: " << input << std::endl;
std::cout << "Compressed: " << compressed.size() << std::endl;
std::cout << "Decompressed: " << decompressed << std::endl;
return 0;
}
这些示例代码展示了如何使用 zlib、bzip2 和 libarchive 库在 Linux 系统下进行 C++ 数据压缩和解压。你可以根据自己的需求选择合适的库进行操作。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。