一. Base64編碼由來
? 為什么會有Base64編碼呢?因為有些網(wǎng)絡(luò)傳送渠道并不支持所有的字節(jié),例如傳統(tǒng)的郵件只支持可見字符的傳送,像ASCII碼的控制字符就 不能通過郵件傳送。這樣用途就受到了很大的限制,比如圖片二進制流的每個字節(jié)不可能全部是可見字符,所以就傳送不了。最好的方法就是在不改變傳統(tǒng)協(xié)議的情 況下,做一種擴展方案來支持二進制文件的傳送。把不可打印的字符也能用可打印字符來表示,問題就解決了。Base64編碼應(yīng)運而生,Base64就是一種 基于64個可打印字符來表示二進制數(shù)據(jù)的表示方法。
二. Base64編碼原理
看一下Base64的索引表,字符選用了"A-Z、a-z、0-9、+、/" 64個可打印字符。數(shù)值代表字符的索引,這個是標準Base64協(xié)議規(guī)定的,不能更改。
| 編號 | 字符 | 編號 | 字符 | 編號 | 字符 | 編號 | 字符 |
|---|---|---|---|---|---|---|---|
| 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 | / |
? 對字符A進行base64進行編碼,我們知道三個字節(jié)有24個位,就可以剛好對應(yīng)于4個Base64單元,即3個字節(jié)需要用4個Base64的可打印字符來表示。如圖man轉(zhuǎn)換為base64所示:

如果最后剩下兩個輸入數(shù)據(jù),在編碼結(jié)果后加1個“=”;如果最后剩下一個輸入數(shù)據(jù),編碼結(jié)果后加2個“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。

?
說起B(yǎng)ase64編碼可能有些奇怪,因為大多數(shù)的編碼都是由字符轉(zhuǎn)化成二進制的過程,而從二進制轉(zhuǎn)成字符的過程稱為解碼。而Base64的概念就恰好反了,由二進制轉(zhuǎn)到字符稱為編碼,由字符到二進制稱為解碼。
? Base64編碼主要用在傳輸、存儲、表示二進制等領(lǐng)域,還可以用來加密,但是這種加密比較簡單,只是一眼看上去不知道什么內(nèi)容罷了,當然也可以對Base64的字符序列進行定制來進行加密。
python應(yīng)用如下
python 將字符轉(zhuǎn)換為base64方法如下
import base64
encode_str = base64.b64encode(b'A')
print(encode_str) # 將A轉(zhuǎn)換為base64為QQ==
decode_str = base64.b64decode(encode_str) # 將QQ==解碼
print(decode_str)
轉(zhuǎn)載于:
[1] http://blog.csdn.net/wodeyuer125/article/details/45150223
[2] http://www.cnblogs.com/chengmo/archive/2014/05/18/3735917.html