首页 > 代码库 > Base64 编码原理

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字节 前面补030                         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         }
控制台实现