今天晚上左哥给我们讲解了前天的测试题目后,我又用剩余的时间把哈夫曼解压算法最终版完成了,期间遇到了一个码表补零的小问题,所以出了错误,但是最后还是发现问题,解决了。
哈夫曼解压文件就是:把压缩文件提取码表各个编码的长度,然后对应后面的编码串,把哈夫曼编码串读入解压程序,然后压缩文件再转化成字符串,再对应码表一一解码,最终就可以得到解压后的文件了。
核心代码如下:
public void reCom(FileInputStream fis)throws Exception{
FileOutputStream fos = new FileOutputStream("C:\\Users\\asus\\Desktop\\new.txt");
String str = "";
int value ;
int zero;
//读取压缩文本的内容 ,value用来接收读取的整形数据,str用来存储压缩文本转化后的01字符串,zero用来处理末尾补零的字符串
while(fis.available()!=0){
value = fis.read();
str = str + IntToString(value);
zero = value;
}
// 26 10110011 11100000 00000100
//00011010 10110011 11100000 00000100------>str
//00011010 10110011------>preStr
zero = StringToInt(str.substring(str.length()-8,str.length()));
String preStr = new String();
preStr = str.substring(0, str.length()-8-zero);
System.out.println(preStr);
//preStr为压缩文件的哈夫曼编码,只要按照码表解码就可解压文件
int count = 0;
String strNew = new String();
int last = preStr.length();
//解压文件,处理01字符串,对应码表翻译,以下是解码
for(int i=0;i<last;i++){
strNew = strNew + preStr.substring(0, 1);
preStr = preStr.substring(1);
System.out.println(i+" "+strNew);
while(count<256){
//如果字符串匹配上了,就写到解压文件上
if(strNew.equals(codestr[count])){
strNew = "";
fos.write(count);
count = 0;
break;
}else{
count++;
}
}
count = 0;
}
}
下面是结果图片:
快十点了,也该走了。回去洗洗睡了