从上一步我们已经生成了huffmanTree ,我们根据这个tree来形成编码,左边路径是 0 ,右边的路径是 1.
private static void createCode(Huf huf, String code, StringBuilder sb) {
StringBuilder sb2 = new StringBuilder(sb);//每次是一个新的,用于把,之前的拿过来。
if (huf != null) {//这个算是一个退出条件。也就是父节点没有其中一个节点的时候
sb2.append(code);//拿到当前的。
if (huf.value == null) {
createCode(huf.left,"0",sb2);
createCode(huf.right,"1",sb2);
}else{
codes.put(huf.value, sb2.toString());//这个是真正要执行的。
}
}
}
从前一步我们得到了每个字母对应的编码。然后遍历原始的数组,找到对应的编码
private static byte[] encode(byte[] bytes, HashMap<Byte, String> codes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
String s = codes.get(b);
sb.append(s);
}//for结束之后,就是一个编码后的字符串了
System.out.println("sb.length() = " + sb.length());
System.out.println("sb = " + sb);
int len = (sb.length() + 7) / 8;//这并不是%,而是/因为 因为你要的是取整。
System.out.println("len = " + len);
byte[] res = new byte[len];
int index = 0;
for (int i = 0; i < sb.length(); i+=8) {
String part;
if ((i + 8) > sb.length()) {
part = sb.substring(i);
}else {
part = sb.substring(i, i + 8);//包含头不包含尾。
}
byte b = (byte) Integer.parseInt(part,2);//这个必须是2进制的否则有问题
res[index]=b;
index+=1;
}
return res;
}
本文详细介绍了一种基于Huffman树的编码压缩算法实现过程。文章首先生成Huffman树,随后根据树结构为每个字符分配唯一的编码,左边路径对应0,右边路径对应1。接着,遍历原始数据数组,将每个字符替换为其对应的Huffman编码,形成编码后的字符串。最后,通过将编码字符串转换为字节数组完成数据压缩。此方法有效减少了数据存储空间。
2318

被折叠的 条评论
为什么被折叠?



