你知道什么是Base64吗?

Base64 编码,首先我们应该搞清楚,为什么里面有个 64 的字样呢?其实是因为该编码使用 64 个明文来编码任意 的二进制文件,它里面只使用了 A-Z,a-z,0-9,+,/这 64 个字符,有“略懂”的同学就会说了,里面还有“=”号啊,不错,不过等号不属于编码字符,而是填充字符。


还有就是,为什么发明这么个编码呢,其实这个编码的原理是很简单的,“破解”也很容易,电子邮件刚出来的 时候,只传递英文字符,这没有问题,但是后来,中国人,日本人都要发 email,这样问题就来了,因为这些字符有可能会被邮件服务器或者网关当成命令处 理,故必须得有一种编码来对邮件进行加密,但是加密的目的是为了能够使得一些原始的服务器不出问题(新得牛叉服务器已经能处理这些乱七八糟得情况了,不过 因为已经形成了一套规范,所以邮件还是得经过 Base64 编码才能传递),这样加密必须得简单(那搞个取反,异或加密吧,:-),还是没解决根本问题 咯),加密简单,这样客户端程序加密解密也快,又要是明文 Ascii 编码,这样 Base64 就诞生了。当初设计人员主要是考虑了两个问题:

1、加密算法复杂程度和效率
2、如何处理传输

Base64 基本都能满足,如果因为发一封邮件把 CPU 占到 100%或者把内存给用完了,那就完全没必要了,编码之后只要普通人一眼看不出内容就行了。

下面谈谈 Base64 的编码原理,按照 RFC2045 的定义,The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.我之前在网上查 Base64 的资料时,发现了一个很好的网站,
base64 编码在线转换器 :http://www.motobit.com/util/base64-decoder-encoder.asp, 大家对 Base64 感兴趣的话,可以去看看。Base64 编码要求把 3 个 8 位字节(3*8=24)转化为 4 个 6 位的字节(4*6=24),之后在 6 位的前 面补两个 0,形成 8 位一个字节的形式。6bit2 进制能表示的最大数是 2 的 6 次方减一,刚好是 64,这也是为什么是 64 个字符的原因,这样就需要一张映射表,表如下:

索引
对应字符
索引
对应字符
索引
对应字符
索引
对应字符
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 个字节转换成 4 个字节((3 X 8)=24=(4X6)),先读入 3 个字节,每读一个字节,左移 8 位,再右移四次,每次 6 位,这样就有 4 个字节了。
解码原理:将 4 个字节转换成 3 个字节,先读入 4 个 6 位(用或运算),每次左移 6 位,再右移 3 次,每次 8 位,这样就还原了。

Base64 将 3 个字节转变为 4 个字节,因此,编码后的代码量(以字节为单 位,下同)约比编码前的代码量多了 1/3。如果代码量正好是 3 的整数倍,那么恰好多了 1/3。但如果不是呢?这个时候“=”终于派上用场啦,当代码量不是 3 的整数倍时,代码量/3 的余数自然就是 2 或者 1。转换的时候,结果不够 6 位的用 0 来补上相应的位置,之后再在 6 位的前面补两个 0。转换完空出的结果就用 就用“=”来补位,总之要保证最后编码出来得字节数是 4 的倍数。

原理也说了表也给了,大家可以编码了哈……

2 条评论

发表评论

*