Java小程序之哈夫曼树与文件压缩和解压缩(三)文件解压篇

本文介绍Java中使用哈夫曼树进行文件解压缩的原理和实现方法,包括解压流程、如何根据哈夫曼编码还原数据,以及解压工程的源代码展示。在解压过程中,首先读取哈夫曼编码和长度信息,然后根据编码还原原始数据。文件解压是压缩的逆过程,需要遵循哈夫曼编码的特性避免解压错误。
摘要由CSDN通过智能技术生成

Java小程序之哈夫曼树与文件压缩和解压缩(三)文件解压篇

一、解压原理:
了解了压缩原理之后,要解压文件就是压缩文件的逆过程;拿昨天的例子来说,如果我们收到这样一串二进制1 1 01 1 1 01 00(昨天漏掉了一个问题,这里是9个0 1,每8个一个字节,那么剩下的那个0需要补7个0,构成一个完整的字节,这样才能写出文件)怎么解压出aabbac呢?很自然的想到,我们需要拿到对应的哈夫曼编码;a的编码是1,b的编码是01,c的编码是00;拿到这个编码后,我们开始对这个0 1串分割,先取出一个0或1,看是否有对应的编码,如上,我们先取第一个1,编码中有1的编码,对应a,那么把第一个1还原为a,接下来,再去一个0或1,得到1,编码中有1,对应a,那么还原为a,接下来去0,没有编码,取01对应b,把01还原为b......以此类推
有人会怀疑这样的正确性,不会解压错误吗?比如如果编码中有1 和11,那么11改怎么还原呢?是解析成两个1进行还原,还是解析成一个11进行还原呢?其实不用担心,这就是哈夫曼编码的优势,哈夫曼编码中不会出现这样的问题;不相信的话,你可以自己去检验下;

将这么多,其实很简单,就类似于情报的破解,我只要有密码本就可以了;而哈夫曼编码就是我们的密码本;

二、哈夫曼树文件解压实现:
文件的压缩和解压缩是两个相对独立的程序;所以,我们在把压缩数据写入文件之前,需要把该文件对应的哈夫曼编码一起写入文件,相当于解压时的密码本;
所以,昨天的压缩程序还少了一步,就是把编码写入压缩文件中;我们只需把每个字母对应的哈夫曼编码的长度以及所有字母对应的哈夫曼编码写入文件即可;


读取文件的时候,先读取每个哈夫曼编码的长度,在根据长度去分割写入的哈夫曼编码,同时把哈夫曼编码写入对应的位置即可;如上图所示,前面的96长度都是0,不需要分割哈夫曼编码;97的长度是1,则分割1,并把1存入对应的字符数组中;同时分割01,把01存储在字符数组的第98个位置;以此类推;

难点:处理不够8位01的写入,记得把补0的个数一起
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值