数据的解压
实现数据压缩的步骤
1.首先将byte数组转换成二级制字符串,
- 代码实现
/**
* 将压缩的数据进行解压
* 1。将数据还原成二进制字符串
* 2.
* @param b
* @param flag
* @return
*/
public static String byToStr(boolean flag,byte b){
int temp=b;
if(flag){
temp |=256;
}
String str = Integer.toBinaryString(temp);
if(flag){
return str.substring(str.length()-8);
}else {
return str;
}
}
将数据解压成二进制字符串之后,就开始进行解压
反向遍历map集合,将数据反向存储到map集合里
然后进行遍历,如果匹配到就将元素存入到byte数组中。
- 代码如下
/**
* 解压赫夫曼
* @param huffmanCodes
* @param huffmanBytes
* @return
*/
public static byte[] decode(Map<Byte,String> huffmanCodes,byte[] huffmanBytes){
StringBuilder stringBuilder = new StringBuilder();
for(int i=0;i<huffmanBytes.length;i++){
byte b = huffmanBytes[i];
boolean flag=(i==huffmanBytes.length-1);
stringBuilder.append(byToStr(!flag,b));
}
System.out.println("转换成二进制字符"+stringBuilder.toString());
//接下来我们要反向查询
HashMap<String, Byte> map = new HashMap<>();
for(Map.Entry<Byte,String> entry:huffmanCodes.entrySet()){
map.put(entry.getValue(),entry.getKey());
}
System.out.println("map"+map);
List<Byte> list=new ArrayList<>();
for(int i=0;i<stringBuilder.length();){
int count=1;
boolean flag=true;
Byte b=null;
while (flag){
String key = stringBuilder.substring(i, i + count);
b=map.get(key);
if(b==null){
count++;
}else {
flag=false;
}
}
list.add(b);
i+=count;
}
byte[] b=new byte[list.size()];
for(int i=0;i<b.length;i++){
b[i]=list.get(i);
}
return b;
}