base64
百度百科:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
所有的数据都能被编码为并只用65个字符{‘A’~‘Z’ , ‘a’ ~ ‘z’ , ‘+’ , ‘/’ ,’=’ }就能表示的文本文件,实际上base64对应的编码字母表只有64个{‘A’~‘Z’ , ‘a’ ~ ‘z’ , ‘+’ , ‘/’ },‘=‘只是一个占位符。
转换步骤:
第一步,将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
第二步,将上面的24个二进制位每6个一组,共分为4组。
第三步,在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
第四步,根据Base64编码对照表获得对应的值。
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
用3个字节一组呢?因为6和8的最小公倍数为24,三个字节正好24个二进制位,每6个bit位一组,恰好能够分为4组。
有时候会出现所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节,这时在最后一组填充1到2个0字节,并在最后编码完成后在结尾添加1到2个=号。
举个例子
比如halo这个单词
对应的ASCII码值分别为:68 61 108 111
转换成二进制:
01000100 00111101 01101100 01101111
对前3个字节进行操作,划分为6bit一个字节:
010001 000011 110101 101100
高位补0:
00010001 00000011 00110101 00101100
转换成十进制:
17 ,3 ,53,44
对应于base64的编码为:RD1s
由上面发现,原数据的每3个字节经过base64的转换后都会变成4个字节。因此,Base64编码之后的文本,要比原文大约三分之一。
再下一组,发现只有1个字节(01101111),凑不够3个字节,经转换的base64的二进制编码为
00011011 00110000
低位,此时后面还有两个字节用“=”补上,所以最后的base64编码为 bw==
延申
base64取的是6位(26),同理,base32取的是5位(25),base16取4位,对应于16进制。
参考了很多资料,我也忘了出自哪。如果有什么错误,望各位指正,不胜感激。