生成hrffmanTree 以及利用huffmanTree的编码,对原byte[]进行编码

本文详细介绍了一种基于Huffman树的编码压缩算法实现过程。文章首先生成Huffman树,随后根据树结构为每个字符分配唯一的编码,左边路径对应0,右边路径对应1。接着,遍历原始数据数组,将每个字符替换为其对应的Huffman编码,形成编码后的字符串。最后,通过将编码字符串转换为字节数组完成数据压缩。此方法有效减少了数据存储空间。

从上一步我们已经生成了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;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值