Base64编码原理(纯手编码自己姓名)

一、Base64原理

Base64中的64表示的是0-16 A-Z a-z 和+ / 一共64个字符

Base64是一种编码方式,而并非加密,这种编码因为采用的64种基础字符(可见字符)所以可以全世界通用,大家都认可这一套编码规范

Base64编码原理(纯手编码自己姓名)

为什么只需要64个字符就可以编码所有的世界上已知的字符 

目前单字符占用最大字节数3个(特殊字符) 中文2个 英文1个

一个字节8 bit

一个最大的字符占3*8=24bit

转化为二进制 最小00000000 最大11111111

base64中对二进制进行重新分组 

3组8位二进制数-->4组6位二进制数

Base64编码原理(纯手编码自己姓名)

这边编码方式  最小000000 最大111111 转换为10进制 0-63 一个64个数字

结论:64个数据已经可以编码目前世界上最大字节的字符,所以64已经完全足够,而不需要更多

二、编码步骤

第一步:找到中文在操作系统中的字符编码表对应的十进制代码

第二步:把十进制转化为二进制

第三步:对二进制进行重新分组

第四步:每一组的值转化为十进制

第五步:在base64中找到对应的值即可

三、实际操作

将谢文峰进行编码

找到汉字对照编码表gb2312 http://www.knowsky.com/resource/gb2312tbl.htm

谢  D0B0+B = 53435                                               文 CEC0 +4 = 52932

Base64编码原理(纯手编码自己姓名)Base64编码原理(纯手编码自己姓名)

峰 B7E0+5 = 47077

Base64编码原理(纯手编码自己姓名)

将十进制转化为二进制

1101000010111011  1100111011000100  1011011111100101

将3*8 --> 4*6

110100 001011 101111 001110 110001 001011 011111 100101

转化为对应的十进制

52 11 47 14 49 11 31 37

在上图中的base64编码表中转化为对应的字符

0 L v O x L f l

四、测试

注意编码格式要为gb2312,因为汉字对照编码表也是对应的gb2312

之前写的utf-8 怎么核对都不对 ,后来发现用的是gb2312的汉字对照表

package com.huajie.others;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.util.Base64;

@Slf4j
public class Base64Test {

    @Test
    public void test() throws UnsupportedEncodingException {
        String name = "谢文峰";
        String encodeName = Base64.getEncoder().encodeToString(name.getBytes("gb2312"));
        log.info(encodeName);

        byte[] decode = Base64.getDecoder().decode(encodeName);
        log.info(new String(decode,"gb2312"));
    }

}

运行结果与手动编码一致

Base64编码原理(纯手编码自己姓名)