BASE64是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之一,例如可以將小圖片直接編碼爲BASE64格式直接通過接口傳輸。
在RFC2045中是這樣定義的,BASE64內容傳送編碼被設計用來把任意序列的8位字節描述爲一種不易被人直接識別的形式。
BASE64要求把每三個8Bit的字節轉換爲四個6Bit的字節(3*8 = 4*6= 24),然後把6Bit再添兩位高位0,組成四個8Bit的字節,也就是說,轉換後的字符串理論上將要比原來的長1/3。
例如:
轉換前 aaaaaabb ccccdddd eeffffff (a,b,c,d,e,f代表0/1)
轉換後 00aaaaaa 00bbcccc 00ddddee 00ffffff
上面的三個字節是原文,下面的四個字節是轉換後的Base64編碼,其前兩位均爲0。轉換後,用一個碼錶來得到目的字符串(也就是最終的BASE64編碼)
編碼表(RFC2045)
VALUE |
ENCODING |
VALUE |
ENCODING |
VALUE |
ENCODING |
VALUE |
ENCODING |
0 |
A |
16 |
Q |
32 |
g |
48 |
w |
1 |
B |
17 |
R |
33 |
h |
49 |
x |
2 |
C |
18 |
S |
34 |
i |
50 |
y |
3 |
D |
19 |
T |
35 |
j |
51 |
z |
4 |
E |
20 |
U |
36 |
k |
52 |
0 |
5 |
F |
21 |
V |
37 |
l |
53 |
1 |
6 |
G |
22 |
W |
38 |
m |
54 |
2 |
7 |
H |
23 |
X |
39 |
n |
55 |
3 |
8 |
I |
24 |
Y |
40 |
o |
56 |
4 |
9 |
J |
25 |
Z |
41 |
p |
57 |
5 |
10 |
K |
26 |
a |
42 |
q |
58 |
6 |
11 |
L |
27 |
b |
43 |
r |
59 |
7 |
12 |
M |
28 |
c |
44 |
s |
60 |
8 |
13 |
N |
29 |
d |
45 |
t |
61 |
9 |
14 |
O |
30 |
e |
46 |
u |
62 |
+ |
15 |
P |
31 |
f |
47 |
v |
63 |
/ |
再舉一例:
轉換前 1010110110111010 01110110
轉換後 0010101100011011 00101001 00110110
十進制 43 27 4154
對應碼錶中的值 r b p2
所以上面的24位編碼,編碼後的BASE64值爲 rbp2。解碼同理,把 rbq2 的二進制位連接上再重組得到三個8位值,得出原碼。
但是原文的字節數量不一定是3的倍數。解決辦法是這樣的:原文的字節不夠的地方可以用全0來補足,轉換時BASE64編碼用=號來代替。這就是爲什麼有些BASE64編碼會以一個或兩個等號結束的原因,但等號最多隻有兩個。因爲:
所以餘數任何情況下都只可能是0,1,2這三個數中的一個。如果餘數是0,就表示原文字節數正好是3的倍數。如果是1,爲了讓BASE64編碼是4的倍數,就要補2個等號;同理,如果是2,就要補1個等號。