在網絡傳入字符串過程中,如果編碼方式是基於ASCII,那麼會造成什麼問題?比如:url地址中存在"/"(如:www.csdn.net/nav/ai),字符串中編碼中也存在"/",這樣就會出現錯誤地址解析.爲了防止這種情況的出現,出現了Base16,Base32,Base64編碼方式.我們知道計算機傳輸的單位是字節,也就是8個比特位,按照一個字節編碼的方式結果就有256種狀態(每個比特位0或者1兩種狀態,8位就是=256),ASCII編碼是將8個比特位中最高位置爲0,所以總共可表示128個字符(即=128).爲了避免衝突,去掉一些特殊字符,重新編碼.例如Base16編碼,編碼後的字符只會在(0~9,A~F)中,Base32編碼後字符就會在(A~Z, 2~7)中以及填充符"="中出現.
Base16編碼
Base16編碼就是將ASCII字符集中可打印的字符(數字0~9和字母A~F)對應的二進制字節數據進行編碼,編碼的方式:
1.將數據(根據ASCII編碼,UTF-8編碼等)轉成對應的二進制數,不足8比特位高位補0.然後將所有的二進制全部串起來,4個二進制位爲一組,轉化成對應十進制數.
2.根據十進制數值找到Base16編碼表裏面對應的字符.Base16是4個比特位表示一個字符,所以原始是1個字節(8個比特位)剛好可以分成兩組,也就是說原先如果使用ASCII編碼後的一個字符,現在轉化成兩個字符.數據量是原先的2倍.
Base16編碼表
案例:將"ILU"字符串,根據ASCII編碼得到對應的二進制,將所有二進制串起來,然後按4個二進制位分割,轉化成十進制數值,根據Base16編碼表得到編碼"494C55",編碼後的數據是原先的2倍.
文本 |
I |
L |
U |
|||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII編碼 |
73 |
76 |
85 |
|||||||||||||||||||||
二進制位 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
十進制數值 |
4 |
9 |
4 |
12 |
5 |
5 |
||||||||||||||||||
Base16編碼 |
4 |
9 |
4 |
C |
5 |
5 |
Base32編碼
與Base16編碼區別的是,Base32使用了ASCII編碼中可打印的32個字符(大寫字母A~Z和數字2~7)對任意字節數據進行編碼.Base32將串起來的二進制數據按照5個二進制位分爲一組,由於傳輸數據的單位是字節(即8個二進制位).所以分割之前的二進制位數是40的倍數(40是5和8的最小公倍數).如果不足40位,則在編碼後數據補充"=",一個"="相當於一個組(5個二進制位),編碼後的數據是原先的倍.
Base32編碼表
案例:"ILU"字符串根據Base32編碼進行編碼,先根據ASCII編碼得到對應字符編碼值以及對應二進制,將所有二進制串起來,然後按照5個二進制位爲一組分割 ,得到十進制值=>找到Base32編碼表找到對應的字符.案例總共分割成了5組(25位),還差三組(15位).在末尾補充3個"=".經過Base32編碼後最終值應是"JFGFK===".
文本 |
I |
L |
U |
|||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII編碼 |
73 |
76 |
85 |
|||||||||||||||||||||
二進制位 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
十進制數值 |
9 |
5 |
6 |
5 |
10 |
|||||||||||||||||||
Base32編碼 |
J |
F |
G |
F |
K |
Base64編碼
Base64編碼使用了ASCII編碼中64個可打印的字符(大寫字母A~Z,小寫字母a~z,數字0~9以及"+","/")將任意字節數據進行編碼.Base64編碼將串起來的二進制以6位進行分割.所以分切之前的二進制位數應該是24的倍數(即6,8的最小公倍數).如果不足24位,則在編碼後數據後面添加"=",一個"="想當於6個二進制位.數據量是原先的倍.
Base64編碼表
案例:"ILU"字符串編碼,前面的過程與Base16編碼,Base32編碼一樣,區別是將串起來的二進制按6位分爲一組.得到4組(24位).所以末尾不用補充"=",所以經過Base64編碼後的結果是"SUxV".
文本 |
I |
L |
U |
|||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII編碼 |
73 |
76 |
85 |
|||||||||||||||||||||
二進制位 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
十進制數值 |
18 |
20 |
49 |
21 |
||||||||||||||||||||
Base64編碼 |
S |
U |
x |
V |
總結
1.Base16編碼是包含了數字(0~9)和大寫字母(A~F),Base32編碼與Base64編碼最大區別是前者沒有小寫字母.Base32編碼可以用於文件系統的名稱(不區分大小情況).而Base64編碼後數據量相比原先不是增加很多,可以用於網絡傳輸.(比如下載鏈接)