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 }