Base64 编码原理

1.编码表

2.原理[汉字不能base64编码]

 base64 编码就是将字符以3个为一组,因为一个字符由8个位组成,3*8=24位,然后以顺序以6个位拿出,前面补2位,凑成8位--一个字节

原字节不能被3整除的,在后面补 由8个0,构成的单字节,一般补1个或是2个(0000 0000),这些后面补的字节不能用base64编码对应,应该是异常字符,用“=”号替换,

所以,base64编码一般最后会有1~2个“=”号

示例:

base64编码前:Lucy
            L           u           c           y
ASCII: 76 117 99 121
8bit字节: 01001100 01110101 01100011 01111001 00000000 00000000
6bit字节: 010011 000111 010101 100011 011110 010000 000000 000000
十进制: 19 7 21 35 30 16 (异常) (异常)
对应编码: T H V j e Q = =

base64编码后的结果:THVjeQ==

3.转换过程

 1  1.//得到ascii码
 2                 ascii = Convert.ToInt32(str).ToString();
 3                 2.//得到二进制数据
 4                 binary = Convert.ToString(Convert.ToByte(ascii),2).PadLeft(8,'0');
 5                 3.//截取6字节 前面补0
 6                  bit6 = binary.Substring(0, 6);
 7 
 8                  4.//转换为十进制
 9 
10                  position = Convert.ToInt32(bit6,2);
11 
12                  5.//获取对应的base64码
13 
14                  c = base64hash.ToArray()[position];
基本转换过程

4.控制台实现

 1 static void Main(string[] args)
 2         {
 3             string base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 4             string input = Console.ReadLine();
 5             string ascii = "";
 6             string binary = "";
 7             int i = 0;
 8             string previous="";
 9             int mod=0;
10             string bit6="";
11             int position;
12             char c;
13             StringBuilder sb = new StringBuilder();
14  
15             while (i<input.ToArray().Length)
16             {
17                 char str = input[i];
18                 //得到ascii码
19                 ascii = Convert.ToInt32(str).ToString();
20                 //得到二进制
21                 binary = Convert.ToString(Convert.ToByte(ascii),2).PadLeft(8,'0');
22  
23                 //以3个字符为一组
24                 mod = i % 3;
25                 switch (mod)
26                 {
27                     //组中的第一个字符
28                     case 0:
29                         //截取6字节 前面补0
30                         bit6 = binary.Substring(0, 6);
31                         //转换为十进制
32                         position = Convert.ToInt32(bit6,2);
33                         //获取对应的base64码
34                         c = base64hash.ToArray()[position];
35                         sb.Append(c);
36                         break;
37                     //组中的第二个字符
38                     case 1:
39                         //取前一个字符的后2位+ 当前字符的前4位(二进制格式)
40                         bit6 = (previous.Substring(6, 2) + binary.Substring(0,4));
41                         //转换为十进制
42                         position = Convert.ToInt32(bit6, 2);
43                         //获取对应的base64码
44                         c = base64hash.ToArray()[position];
45                         sb.Append(c);
46                         break;
47                     //组中的第三个字符
48                     case 2:
49                         //取前一个字符的后4位+ 当前字符的前2位(二进制格式)
50                         bit6 = (previous.Substring(4, 4) + binary.Substring(0, 2));
51                         //转换为十进制
52                         position = Convert.ToInt32(bit6, 2);
53                         //获取对应的base64码
54                         c = base64hash.ToArray()[position];
55                         sb.Append(c);
56  
57                         //剩余六位
58                         bit6 = (binary.Substring(2, 6));
59                         //转换为十进制
60                         position = Convert.ToInt32(bit6, 2);
61                         //获取对应的base64码
62                         c = base64hash.ToArray()[position];
63                         sb.Append(c);
64                         break;
65                 }
66                 previous = binary;
67                 i++;
68             }
69  
70             if (mod == 0)//需要补两个字符(0000 0000   0000 0000)
71             {
72                 //将剩下的后2位+补的前4位
73                 bit6 = (previous.Substring(6, 2) + "0000");
74                 //转换为十进制
75                 position = Convert.ToInt32(bit6, 2);
76                 //获取对应的base64码
77                 c = base64hash.ToArray()[position];
78                 sb.Append(c);
79                 //添加两个==(异常)
80                 sb.Append("==");
81             }
82             else if (mod == 1)//需要补一个字符(0000 0000)
83             {
84                 //将剩下的后4位+补的前2位
85                 bit6 = (previous.Substring(4, 4) + "00");
86                 //转换为十进制
87                 position = Convert.ToInt32(bit6, 2);
88                 //获取对应的base64码
89                 c = base64hash.ToArray()[position];
90                 sb.Append(c);
91                 //添加一个=(异常)
92                 sb.Append("=");
93             }
94             Console.WriteLine(sb.ToString());
95  
96             Console.ReadKey();
97         }
控制台实现