Base64编码原理解析

1、算法原理:

将待转换的字符串每3个字节分为一组,得到一个占24位的数;

将得到的24位数每6位分为1组,一共分为4组;

每组前面加00 ,转成4个字节;

新得到的4个字节,每个字节代表的数转成10进制与给定的字符数组中的一个元素对应。

 private static final char[] PWDCHARS_ARRAY = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();


    //编码 Base64字符表中的字符原本用6个bit就可以表示,现在前面添加2个0,变为8个bit,会造成一定的浪费。
    // 因此,Base64编码之后的文本,要比原文大约三分之一。
    public static String encode(byte[] bytes) {
        int len = bytes.length;
        StringBuffer encoded = new StringBuffer((len + 2) / 3 * 4);
        int i = 0;

        int j;
        // 将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
        for(j = len; j >= 3; j -= 3) {
            encoded.append(to64((long)((bytes[i] & 255) << 16 | (bytes[i + 1] & 255) << 8 | bytes[i + 2] & 255), 4));
            i += 3;
        }

        if (j == 2) {
            encoded.append(to64((long)((bytes[i] & 255) << 8 | bytes[i + 1] & 255), 3));
        }

        if (j == 1) {
            encoded.append(to64((long)(bytes[i] & 255), 2));
        }

        return encoded.toString();
    }


    //将上面的24个二进制位每6个一组,共分为4组。
    private static final String to64(long input, int size) {
        StringBuffer result;
        // 63的二进制 0011 1111
        for(result = new StringBuffer(size); size > 0; input >>= 6) {
            --size;
            //从input中取低6位,然后用 00 补齐成8位 比如 输入的3字节数是 1010 1010 1111 1111 0011 0011
            // 那么循环取得的 4字节的数的过程是: 取 低6位 11 0011 -> 0011 0011 ,然后input右移6位,再取
            //低6位 1111 00 -> 0011 1100,   10 1111 -> 0010 1111;  1010 10 -> 0010 1010
            //生成的 0011 0011 对应的二进制数是 51 在数组 PWDCHARS_ARRAY 中对应 的字符是索引是51的字符然后放在result中
            result.append(PWDCHARS_ARRAY[(int)(input & 63L)]);
        }

2、总结

Base64主要用于传输、存储、表示二进制领域,不能算得上加密,只是无法直接看到明文而已。2的6次方是64,所以是Base64。同理用5位就是Base32。

3、append方法效果验证

public class testString {
    public static void main(String[] args) {
        StringBuffer result = new StringBuffer();
        result.append("a");
        result.append("12");
        System.out.println("打印结果:" + result.toString());
    }
}

 输出是: a12。 说明调用该方法是将新的字符串补在原来字符串的末尾。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值