本文介紹基於rfc4648的base64編碼格式,關於如何使用python中的base64模組快速進行編碼,請參考這裡。rfc4648介紹了base64/32/16編碼機制,同時廢止了rfc3548。相關的資料和標準有:rfc2045定義了mime中的base64傳輸編碼,rfc4880定義了openpgp中使用的radix-64編碼。
base64使用64個通用的可列印字元來儲存和表示二進位製字資料,同時也可以進行簡單的加密,生成不可讀文字。base64字符集包括大、小寫英文本母,阿拉伯數字0-9,以及"+"和"/",以及作字尾填充的"="共計65個字元,其中編碼時只使用前64個。如何使用這64個字元來表示二進位制資料呢?這就需要在十進位制的0到63以及使用的64個字元之間建立一一對應關係。具體的對映是將十進位制的0到63依次與"a-z", "a-z", "0-9", "+", "/"一一對應。在計算機中64種可能只需要6bits就能表達(26=64),因此base64表示法實質上是以6bits為單位,使用規定的通用字符集來表示和儲存二進位制資料。
計算機中的資料是以位元組為單位的,且8bits = 1byte。base64中使用6bits表示乙個字元,這就導致了計算機中的三個位元組(8bits*3)在經過base64編碼後將變成四個字元(6bits*4),轉碼後的base64字串將比原資料長大約三分之一。base64的轉碼方法也正是圍繞這樣的換算關係展開。
轉碼時只需使用乙個24bits的緩衝區,依次從原資料中讀入三個位元組的資料,再每次從緩衝中取6bits轉化成base64字元輸出。當原始資料的長度恰好為3bytes的整數倍時,直接轉碼。當讀取到原始資料的末尾剩餘資料不足3位元組時,在原始二進位製碼末尾補0直到恰好是6bits的倍數,這時,第65個字元"="就派上用場了。如果原始文字剛好是3位元組的整數倍,轉碼後不需要在base64編碼末尾新增任何字尾;如果最後剩餘兩位元組,則在轉碼後的字串末尾新增乙個"=",如果最後剩餘一位元組,則在轉碼後的字串末尾新增兩個"="。這個過程可以用下面的圖表示。
情形一:文字長度剛好是3位元組的整數倍
原文本(單位:位元組)ma
n二進位制資料01
0011
0101
1000
0101
1011
10二進位制資料(補0)01
0011
0101
1000
0101
1011
10base64編碼tw
f u
此時轉碼後的字串將為:twfu
情形二:文字比3位元組的整數倍多2位元組
原文本(單位:位元組)ma
二進位制資料01
0011
0101
1000
01二進位制資料(補0後)01
0011
0101
1000
0100
base64編碼tw
e此時轉碼後的字串將為:twe=
情形三:文字比3位元組的整數倍多1位元組
原文本(單位:位元組)
m二進位制資料01
0011
01二進位制資料(補0後)01
0011
0100
00base64編碼tq
此時轉碼後的字串將為:tq==
經過上面規則編碼後的字串解碼也非常簡單。不難發現,由於每一填充符"="代表二進位制原始碼末尾新增了2bits的0,base64編碼後字串的長度將是4的整數倍,根據末尾"="的個數計算編碼過程中補0的個數,就可以正常解碼。另外,在電子郵件中,每行不能容納超過76個字元,解析時注意忽略回車符。
本文介紹了標準base64編碼的格式,事實上還存在「安全url」等變種編碼格式,這些變化適應特定的需求,替代字符集中的部分字元,有興趣的話可以參考rfc4648。
python中基於rfc3548提供了進行base64/32/16編碼的庫,介面非常高效地實現了所需的編碼。關於python中的base64編碼庫,請參考這裡。
BASE64編碼簡介
base64是一種常用的可逆編碼形式,常用於把二進位制編碼轉換為字元形式的資料。編碼後的字串包含a z a z 0 9 共64個字元。64個字元需要用6位來表示,從0開始表示成數字0 63。其實共有65個字元,是填充字元,後面會說到。碼值字元 碼值字元 碼值字元 碼值字元0a 16q32g 48w1...
base64編碼 動畫演示 Base 64 編碼
base64 是一種十分流行的編碼方式,僅僅使用 64 個字元加等號 就可以以文字的形式表示所有的二進位制資料了,因為它能夠把二進位制格式通過編碼轉換成可見字元,所有我們就可以通過的把二進位制格式比如,檔案等通過 base64 編碼然後通過文字的形式共享出去,是不是很神奇呀。把輸入的資料轉換成 二進...
Base64編碼演算法
base64要求把每三個8bit的位元組轉換為四個6bit的位元組 3 8 4 6 24 然 後把6bit再添兩位高位0,組成四個8bit的位元組,也就是說,轉換後的字串理 論上將要比原來的長1 3。轉換後,我們用乙個碼表來得到我們想要的字串 也就是最終的base64編碼 這個表是這樣的 0 a 1...