Base64编码过程

在开发中我们有时需要对一个字符串进行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
10111010
View 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     6
View Code

最后补充,有些字符串转换后会出现 5oiR5piv5Lit5Zu95Lq6MQ== 字符,这表示截取后的字节不足6位,一个 = 号代表补了1个字节也就是8个0

附录一个进制转换工具的网站

https://tool.oschina.net/hexconvert/

原文地址:https://www.cnblogs.com/zumengjie/p/13032908.html