//译码
public String decoding(String codeStr){
int sign=0;
String str="";
//从头开始译码
//for(;codeStr.length()>0;){//跳出循环的条件,译码全部完成
for(;codeStr!="";){//跳出循环的条件,译码全部完成
for(int i=0;i<256;i++){//遍历arrayStr[0~255]与codeStr的前几个编码比较
if(arrayStr[i]!=null){
for(int j=0;j<arrayStr[i].length();j++){//比较前几个编码
if(codeStr.charAt(j)==arrayStr[i].charAt(j)){//存在codeStr剩余不足j个字符的危险
sign=1;
}else{
sign=0;break;//跳出循环
}
}
if(sign==1){//全都符合
//删去
String temp="";
for(int k=arrayStr[i].length();k<codeStr.length();k++){
temp+=codeStr.charAt(k);
}
codeStr = temp;
//codeStr = codeStr.substring(arrayStr[i].length(),codeStr.length());
str+=(char)i;
break;
}
}
}
}
System.out.println(str);
return str;
}
这里是哈弗曼编码的译码函数,可以完成正常的译码,但是有一些疑问:
(1)
//codeStr = codeStr.substring(arrayStr[i].length(),codeStr.length());
当使用这样的代码去删除前几个二进制编码时
循环判断条件就只能是for(;codeStr.length()>0;)
而不能是for(;codeStr!=”“;)
(2)if(codeStr.charAt(j)==arrayStr[i].charAt(j)){
//存在codeStr剩余不足arrayStr[i].length()个字符的危险
这种危险只有在使用
//codeStr = codeStr.substring(arrayStr[i].length(),codeStr.length());
这行代码时才会显露出来