如果哪裏有錯誤希望大家指出,我將不勝感激,如果有任何想法也歡迎留言。
筆記本身也是給我自己寫的,所以如果有侵權的請通知我,我立即刪除。
1.base64的作用
我們知道在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由於不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。所以就先把數據先做一個Base64編碼,把所有字符統統變成可見字符,這樣出錯的可能性就大降低了。
這裏也補充一下ASCII碼的種類,一共有三部分:
- 第一部分:ASCII非打印控制字符- 第二部分:ASCII打印字符- 第三部分:擴展ASCII打印字符
第一部分:ASCII表上的數字0–31分配給了控制字符,用於控制像打印機等一些外圍設備。例如,12代表換頁/新頁功能。此命令指示打印機跳到下一頁的開頭。(參詳ASCII碼錶中0-31)。
第二部分:數字 32–126 分配給了能在鍵盤上找到的字符,當您查看或打印文檔時就會出現。數字127代表 DELETE 命令。(參詳ASCII碼錶中32-127)
第三部分:擴展的ASCII字符滿足了對更多字符的需求。擴展的ASCII包含ASCII中已有的128個字符,又增加了128個字符,總共是256個。即使有了這些更多的字符,許多語言還是包含無法壓縮到256個字符中的符號。因此,出現了一些ASCII的變體來囊括地區性字符和符號。例如,許多軟件程序把ASCII表(又稱作ISO8859-1)用於北美、西歐、澳大利亞和非洲的語言。
《ASCII碼錶完整版》
如果有興趣可以看看《完整ASCII字符表》,ASCII碼是如何表示簡體、繁體和日語等圖形文字的。
2.base64的操作流程
2.1 理論
每個ASCII碼都是一個字節8位,既然要幹掉不可見字符,就不能再用8位爲一個單位了,我現在用6個字節爲一個單位,2^6=64,base64正好是64位,正好夠用。那麼原來8位在ASCII中代表的那個字符,在base64中代表什麼呢?又有了一個新的表。如果覺得有點難懂,就直接看例子。新的表如下圖所示
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
2.2 位數正好的例子
例如目前有三個字符:Man
M的ASCII碼是77,取前六位作爲新的字符,這個字符在上面的表中查找,19是T,所以這個位對應的是T,以此類推,最後Man的base64編碼就是TWFu。
2.3 位數不足的例子
之前有三個字符,3*8=24,24是可以被6整除的,如果有兩個字符,2*8=16,16不能被6整除。
兩個字節:兩個字節共16個二進制位,依舊按照規則進行分組。此時總共16個二進制位,每6個一組,則第三組缺少2位,用0補齊,得到三個Base64編碼,第四組完全沒有數據則用“=”補上。因此,上圖中“BC”轉換之後爲“QKM=”; 一個字節:一個字節共8個二進制位,依舊按照規則進行分組。此時共8個二進制位,每6個一組,則第二組缺少4位,用0補齊,得到兩個Base64編碼,而後面兩組沒有對應數據,都用“=”補上。因此,上圖中“A”轉換之後爲“QQ==”;
3.注意事項
大多數編碼都是由字符串轉化成二進制的過程,而Base64的編碼則是從二進制轉換爲字符串。與常規恰恰相反, Base64編碼主要用在傳輸、存儲、表示二進制領域,不能算得上加密,只是無法直接看到明文。也可以通過打亂Base64編碼來進行加密。 中文有多種編碼(比如:utf-8、gb2312、gbk等),不同編碼對應Base64編碼結果都不一樣。
《一篇文章徹底弄懂Base64編碼原理》這裏圖有點問題,我重新畫的