在开发中我们有时需要对一个字符串进行Base64编码,例如在网络传输中数据使用SCII编码而有些特殊字符是不能被协议解析的,所以对数据进行Base64加密后,在进行传输。
任意的字符串被Base64加密后的字符串只包含都 A-Z a-z 0-9 + / 部分结尾还有 =
1 将字符串转换字节数组,获取10进制字节。
2 将10进制转换2进制
3 如果10进制是负数则需要求出对应整数的2进制,取反,+1
4 如果2进制位数不足8位,前边补0
5 对字节进行6位分组
7 如不足6位则补8个字节的0
8 将截取好的2进制字节转换10进制
9 10进制对应下表就是编码后的结果。
public static void a() throws Exception { String s = "我是中国人"; byte[] encode = Base64.getEncoder().encode(s.getBytes("UTF-8")); String s1 = new String(encode,"UTF-8"); System.out.println(s1); //5oiR5piv5Lit5Zu95Lq6 byte[] decode = Base64.getDecoder().decode(s1.getBytes("UTF-8")); String s2 = new String(decode,"UTF-8"); System.out.println(s2); //我是中国人 }View Code
我是中国人对应的10进制字节 -26,-120,-111,-26,-104,-81,-28,-72,-83,-27,-101,-67,-28,-70,-70, 因为是负数,所以需要取反+1操作 -26 00011010 11100101 11100110 -120 01111000 10000111 10001000 -111 01101111 10010000 10010001 -26 00011010 11100101 11100110 -104 01101000 10010111 10011000 -81 01010001 10101110 10101111 -28 00011100 11100011 11100100 -72 01001000 10110111 10111000 -83 01010011 10101100 10101101 -27 00011011 11100100 11100101 -101 01100101 10011010 10011011 -67 01000011 10111100 10111101 -28 00011100 11100011 11100100 -70 01000110 10111001 10111010 -70 01000110 10111001 10111010View Code
分成6个一组,转换10进制,查编码表 111001 101000 100010 010001 111001 101001 100010 101111 111001 001011 100010 101101 111001 011001 101110 111101 111001 001011 101010 111010 57 40 34 18 57 41 34 47 57 11 34 37 57 25 46 61 57 11 42 58 5 o i R 5 p i v 5 L i t 5 Z u 9 5 L q 6View Code
最后补充,有些字符串转换后会出现 5oiR5piv5Lit5Zu95Lq6MQ== 字符,这表示截取后的字节不足6位,一个 = 号代表补了1个字节也就是8个0
附录一个进制转换工具的网站
https://tool.oschina.net/hexconvert/