首页 > 后端开发 > C++ > 正文

C++实现文件压缩工具 基本压缩算法实践解析

P粉602998670
发布: 2025-08-17 20:13:01
原创
246人浏览过
答案是使用C++实现哈夫曼编码压缩工具,通过统计字节频率构建最小堆哈夫曼树,生成变长编码并逐位写入比特流,同时保存频率表用于解压,最终实现文件压缩与解压,压缩率可达30%-50%,适用于理解无损压缩核心原理。

c++实现文件压缩工具 基本压缩算法实践解析

文件压缩在现代软件开发中非常常见,C++作为高性能语言,非常适合实现压缩工具。本文带你用C++实现一个简易但完整的文件压缩工具,采用哈夫曼编码这一经典无损压缩算法,解析其核心原理与代码实现。

哈夫曼压缩原理简述

哈夫曼编码是一种基于字符出现频率的变长编码方式,出现频率高的字符用短编码,频率低的用长编码,从而减少整体存储空间。

实现步骤包括:

  • 统计文件中每个字节的出现频率
  • 构建哈夫曼树(优先队列实现最小堆)
  • 生成每个字节对应的二进制编码
  • 将原始文件内容替换为编码后的比特流
  • 保存编码表和压缩数据到输出文件

核心数据结构与编码实现

定义哈夫曼树节点:

立即学习C++免费学习笔记(深入)”;

struct Node {
    uint8_t byte;
    int freq;
    Node *left, *right;
<pre class='brush:php;toolbar:false;'>Node(uint8_t b, int f) : byte(b), freq(f), left(nullptr), right(nullptr) {}
登录后复制

};

使用优先队列构建哈夫曼树:

auto cmp = [](Node* a, Node* b) { return a->freq > b->freq; };
std::priority_queue<Node*, std::vector<Node*>, decltype(cmp)> pq(cmp);
<p>// 统计频率后,将每个字节作为叶子节点入队
for (int i = 0; i < 256; i++) {
if (freq[i] > 0) {
pq.push(new Node(static_cast<uint8_t>(i), freq[i]));
}
}</p><p>// 构建树
while (pq.size() > 1) {
Node <em>left = pq.top(); pq.pop();
Node </em>right = pq.top(); pq.pop();
Node *parent = new Node(0, left->freq + right->freq);
parent->left = left;
parent->right = right;
pq.push(parent);
}</p>
登录后复制

递归生成编码表:

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译
void buildCode(std::string code, Node* node, std::string codes[256]) {
    if (!node) return;
    if (!node->left && !node->right) {
        codes[node->byte] = code.empty() ? "0" : code;
    }
    buildCode(code + "0", node->left, codes);
    buildCode(code + "1", node->right, codes);
}
登录后复制

压缩与解压文件操作

压缩时,将编码写入比特流。由于文件以字节为单位存储,需手动处理比特拼接:

  • 使用一个缓存字节和位计数器
  • 逐位写入编码,满8位写入文件
  • 压缩头信息中保存编码表(字节+频率)用于解压

示例写入比特:

uint8_t buffer = 0;
int bitCount = 0;
<p>void writeBit(std::ofstream& out, int bit) {
buffer |= (bit << (7 - bitCount));
bitCount++;
if (bitCount == 8) {
out.write(reinterpret_cast<char*>(&buffer), 1);
buffer = 0;
bitCount = 0;
}
}</p>
登录后复制

解压时从哈夫曼树根节点开始,读每一位,0向左,1向右,到达叶子节点输出字节,再从根重新开始。

使用示例与效果

调用方式简单:

compress("input.txt", "output.bin");
decompress("output.bin", "restored.txt");
登录后复制

对文本文件压缩率通常可达30%-50%,二进制文件效果取决于数据分布。虽然不如zlib等库高效,但有助于理解压缩本质。

基本上就这些。掌握哈夫曼编码的实现,为进一步学习LZ77、DEFLATE等复杂算法打下基础。整个过程不复杂但容易忽略细节,比如比特对齐和文件头设计。

以上就是C++实现文件压缩工具 基本压缩算法实践解析的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号