什么是Base64?
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
Base64编码详解
Base64 编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。
具体转化形式间下图:
字符串”小李”,GBK的中文编码是D0A1 C0EE,转化成字节为
11010000 10100001 11000000 11101110
再把8位转为6位
00110100 00001010 00000111 00000000 00111011 00100000
可以这么考虑:把8位的字节连成一串 11010000101000011100000011101110
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到30个二进制数被选,剩下两个怎么办呢,前面照旧补两个0,后面不够6位的,全部用0补全。
让我们来看看实际结果:
字符串”小李”
11010000 HEX:D0 10100001 HEX:A1 11000000 HEX:C0 11101110 HEX:EE
00110100 00001010 00000111 00000000 00111011 00100000
十进制52 十进制10 十进制7 十进制0 十进制59 十进制32
Base64有其自身的编码表:
The Base64 Alphabet
Value Encoding
0 A
1 B
2 C
3 D
4 E
5 F
6 G
7 H
8 I
9 J
10 K
11 L
12 M
13 N
14 O
15 P
16 Q
17 R
18 S
19 T
20 U
21 V
22 W
23 X
24 Y
25 Z
26 a
27 b
28 c
29 d
30 e
31 f
32 g
33 h
34 i
35 j
36 k
37 l
38 m
39 n
40 o
41 p
42 q
43 r
44 s
45 t
46 u
47 v
48 w
49 x
50 y
51 z
52 0
53 1
54 2
55 3
56 4
57 5
58 6
59 7
60 8
61 9
62 +
63 /
(pad)=
这也是 Base64名称的由来,而Base64编码的结果不是根据算法把编码变为高两位是0而低6为代表数据,而是变为了上表的形式。表中,编码的编号对应的是得出的新字节的十进制值。因此,从表2可以得到对应的Base64编码:
字符串”小李”
11010000 HEX:D0 10100001 HEX:A1 11000000 HEX:C0 11101110 HEX:EE
00110100 00001010 00000111 00000000 00111011 00100000
十进制52 十进制10 十进制7 十进制0 十进制59 十进制32
这样,字符串”小李”经过编码后就成了字符串”0KHA7g”了。
Base64将3个字节转变为4个字节,因此,编码后的代码量(以字节为单位,下同)约比编码前的代码量多了 1/3。之所以说是“约”,是因为如果代码量正好是3的整数倍,那么自然是多了1/3。但如果不是呢?
细心的人可能已经注意到了,在The Base64 Alphabet中的最后一个有一个(pad) =字符。这个字符的目的就是用来处理这个问题的。
当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。譬如结果上面的例子”小李”,就不够3的整数,所以用0来补整6个数,再在前面加两个0.
这样,最后的缺少的2个字节用=不上,所以”小张”的base64_encode就是”0KHA7g==”。
Post a Comment