实现数据压缩的步骤
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; }