標籤:問題 width encode 二進位 src 建議 tab 進位轉換 16px
Base64演算法最早是為瞭解決電子郵件傳輸的問題的,早先的郵件傳輸協議中只支援ASCII碼傳遞,如果要傳輸二進位檔案,片和視頻,是無法傳輸的,而BASE64可以將二進位檔案內容編碼成為只包含ASCII碼的內容,這樣就可以傳輸了。
Base64演算法大家常常說成是密碼編譯演算法,但準確的來說,Base64不是一種密碼編譯演算法,只能算是一種基於64個字元的編碼演算法。
它有一個字元對應表,每個字元對應表了一個十進位編碼,共映射了64個字元。Base64將給定的資料經二進位轉換後與字元對應表相對應,得到所謂的密文;映射表如下,映射表的最後是一個等號,是作為補位符用來補位的。
| 編號 |
字元 |
|
編號 |
字元 |
|
編號 |
字元 |
|
編號 |
字元 |
| 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 |
/ |
|
|
| |
|
Base64演算法的實現步驟如下:
1. 將給定的字串以字元為單位轉換為對應的字元編碼(如ASCII碼);2. 將獲得的字元編碼轉換為二進位碼;3. 對獲得的二進位碼做分組轉換操作,每3個8位二進位碼為一組,轉換為每4個6位二進位碼為一組(不足6位時地位補0).這是一個分組變化的過程,3個8位二進位碼和4個6位二進位碼的長度都是24位;4. 對獲得的4個6位二進位補位,向6位二進位碼添加2位高位0,組成4個8位二進位碼;5. 將獲得的4個8位二進位碼轉換位10進位碼;6. 將獲得的十進位碼轉換位Base64字元表中對應的字元;
ASCII碼字元編碼
例如:對A進行Base64編碼;
最終產生的編碼中有了兩個等號,這是因為原文的二進位碼不足24位,最近轉換為十進位碼時也不足4項,這時就需要用等號補位;
經Base64編碼後的字串最多隻會有2個等號,這是因為 餘數 = 原文位元組數 MOD 3,所以餘數只能時0,1,2。通常判別一個字串是不是Base64編碼的第一步操作就是判斷這個字串末尾是不是有等號。這同時也說明,Base64編碼後的字串是以4個字元為單位,其長度只能是4個字元的整數倍。
非ASCII碼字元編碼
ASCII碼可以表示十進位範圍為0~127的字元,對應二進位範圍是00000000~01111111,ASCII碼包含了阿拉伯數字,大小寫英文字母和一些控制符,但卻沒有包含中文,因此有了GB2312,GBK和UTF-8等編碼。GBK,GB2312用2個位元組來表示一個漢字,UTF-8則用3個位元組來表示一個漢字。
例如:對密這個字以UTF-8的形式進行Base64編碼;
當然,如果我們不使用UTF-8,而是使用GBK來進行編碼,那編碼後的結果就不是5a+G了。
JDK中Base64的實現在JDK1.7之前是沒有對外的公用介面的,只有一個非標準實現,位於sun.misc包中,提供BASE64Encoder類和BASE64Decoder類。由於是不對外,所以不建議使用,因為後續JDK版本可能會去掉對這兩個類的支援。
而JDK8之後已經有了對應的介面,位於java.util包下。
參考自《Java加密解密的藝術》
Java-Base64演算法