定义
MIME
文档传输的
RFC2045
定义了
BASE64
编码。
简要阐述如下:
Base64
编码其实是将
3
个
8
位字节转换为
4
个
6
位字节
,( 3*8 = 4*6 = 24 )
这
4
个六位字节其实仍然是
8
位
,
只不过高两位被设置为
0.
当一个字节只有
6
位有效时
,
它的取值空间为
0
到
2
的
6
次方减
1
即
63,
也就是说被转换的
Base64
编码的每一个编码的取值空间为
(0~63)
。
事实上,
0~63
之间的
ASCII
码有许多不可见字符,所以应该再做一个映射,映射表为
‘A‘ ~ ‘Z‘ ? ASCII
(
0 ~ 25
)
‘a’ ~ ‘z‘ ? ASCII
(
26 ~ 51
)
‘0’ ~ ‘9‘ ? ASCII
(
52 ~ 61
)
‘+‘ ? ASCII
(
62
)
‘/‘ ? ASCII
(
63
)
这样就可以将
3
个
8
位字节,转换为
4
个可见字符。
具体的字节拆分方法为:
aaaaaabb
ccccdddd
eeffffff
字节
1
字节
2
字节
3
转化为:
00aaaaaa 00bbcccc 00ddddee 00ffffff
注:上面的三个字节位原文,下面四个字节为
Base64
编码,其前两位均为
0
。
这样拆分的时候,原文的字节数量应该是
3
的倍数,当这个条件不能满足时,用全零字节补足,转化时
Base64
编码用
=
号代替,这就是为什么有些
Base64
编码以一个或两个等号结束的原因,但等号最多有两个,因为:如果
F(origin)
代表原文的字节数,
F(remain)
代表余数,则
F(remain) = F(origin) MOD 3
成立。
所以
F(remain)
的可能取值为
0,1,2.
如果设
n = [F(origin) – F(remain)] / 3
当
F(remain) = 0
时,恰好转换为
4*n
个字节的
Base64
编码。
当
F(remain) = 1
时,由于一个原文字节可以拆分为属于两个
Base64
编码的字节,为了让
Base64
编码是
4
的倍数,所以应该为补
2
个等号。
当
F(remain) = 2
时,由于两个原文字节可以拆分为属于
3
个
Base64
编码的字节,同理,应该补上一个等号。
具体实现请查看: