Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 re ...
Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation.
Base64是一種用64個可列印字元來表示任意二進位數據的方法,不能用於加密。
為什麼使用Base64格式編碼?
在只支持純文本的協議中需要保存非字元類數據(url(data:image/png;base64,…)),或在只支持ASCII字元的系統中保存非ASCII字元的數據時,可以將數據的二進位形式編碼成Base64形式保存。
ASCII碼的128~255之間的值是不可見字元,在純文本協議的傳輸過程中可能會被錯誤當作控制字元處理引起傳輸失敗。全部編碼成可見字元,降低出錯的可能性。
Base64的編碼轉換方式
- 將每三個位元組分為一組,一共是24 bit。
- 將這24個二進位位分為四組,每個組有6個二進位位。
- 在每組前面固定先加00,這樣每組還是8 bit,有效位是每組的低6位。即原來3個位元組擴展成32個二進位位四位元組。(每組最高值為63)
- 然後查表得到編碼後的字元串。Base64將三個位元組轉化成四個位元組,編碼後的文本會比原文多三分之一。
Base64編碼表
碼值 |
字元 |
|
|
碼值 |
字元 |
|
碼值 |
字元 |
|
碼值 |
字元 |
0 |
A |
|
26 |
a |
52 |
0 |
62 |
+ |
|||
… |
… |
|
… |
… |
… |
… |
63 |
/ |
編碼實例:
source ASCII (if <128) | M | a | n | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
source octets | 77 (0x4d) | 97 (0x61) | 110 (0x6e) | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Index | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Base64-encoded | T | W | F | u | ||||||||||||||||||||
encoded octets | 84 (0x54) | 87 (0x57) | 70 (0x46) | 117 (0x75) |
如果要編碼的二進位數據不是3的倍數,分組後後會剩下1個或2個位元組。Base64用\x00在末尾補足一組後,再在編碼的末尾加上1個或2個=號,表示為了湊成一組補了多少位元組。
多一個位元組時:先在該位元組之後添加2個\x00位元組組成一組,再按照上面的規則轉換成base64碼的4位元組。每個位元組前面2位固定為0,最後在Base64編碼的末尾補上兩個"="號,表示補了2個位元組。
比如,"M"這個字母是一個位元組,可以轉化為二組00010011、00010000,對應的Base64值分別為T、Q,再補上二個"="號,因此"M"的Base64編碼就是TQ==。
Text content | M | 添加\x00補足一組 | 添加\x00補足一組 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII | 77 (0x4d) | 0 (0x00) | 0 (0x00) | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Index | 19 | 16 | 0 | 0 | ||||||||||||||||||||
Base64-encoded | T | Q | = | = |
多二個位元組時:先在這兩個位元組之後添加1個\x00組成一組,再按照上面的規則轉換成base64的4位元組,最後在末尾補上一個"="號。
比如,"Ma"這個字元串是兩個位元組,可以轉化成三組00010011、00010110、00000100以後,對應Base64值分別為T、W、E,再補上一個"="號,因此"Ma"的Base64編碼就是TWE=。
Text content | M | a | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII | 77 (0x4d) | 97 (0x61) | 0 (0x00) | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Index | 19 | 22 | 4 | 0 | ||||||||||||||||||||
Base64-encoded | T | W | E | = |
中文用Base64編碼
先要獲得二進位數據,再根據上述規則轉換。不同的中文編碼方式對應的二進位不同,所有如果不統一容易出現亂碼。
"嚴"的utf-8編碼為3位元組E4B8A5,寫成二進位就是三位元組的"11100100 10111000 10100101",然後轉換成Base64值就是5Lil。