0

0

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

P粉602998670

P粉602998670

发布时间:2025-08-17 20:13:01

|

274人浏览过

|

来源于php中文网

原创

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

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

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

哈夫曼压缩原理简述

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

实现步骤包括:

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

核心数据结构与编码实现

定义哈夫曼树节点:

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

struct Node {
    uint8_t byte;
    int freq;
    Node *left, *right;
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, decltype(cmp)> pq(cmp);

// 统计频率后,将每个字节作为叶子节点入队 for (int i = 0; i < 256; i++) { if (freq[i] > 0) { pq.push(new Node(static_cast(i), freq[i])); } }

// 构建树 while (pq.size() > 1) { Node left = pq.top(); pq.pop(); Node right = pq.top(); pq.pop(); Node *parent = new Node(0, left->freq + right->freq); parent->left = left; parent->right = right; pq.push(parent); }

递归生成编码表:

稿定AI绘图
稿定AI绘图

稿定推出的AI绘画工具

下载
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;

void writeBit(std::ofstream& out, int bit) { buffer |= (bit << (7 - bitCount)); bitCount++; if (bitCount == 8) { out.write(reinterpret_cast(&buffer), 1); buffer = 0; bitCount = 0; } }

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

使用示例与效果

调用方式简单:

compress("input.txt", "output.bin");
decompress("output.bin", "restored.txt");

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

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

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

533

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

13

2026.01.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

386

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

569

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

399

2023.08.14

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

78

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

45

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

118

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.5万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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