2013年11月5日 星期二

[python] base64, base32, binascii

base64 的編碼方式,目的在於把 binary 的資料,用可見的 ascii 表示出來。每三個 byte 的資料,用四個 byte 的可見字元表示[1],所以資料會變大 1.33倍。老骨頭們應該有聽過 uuencode,那也是一樣的目的。通常會選擇 64 個可見字元,目前 base64 常見的應用在 MIME's Base64,它所選擇的字有 0-9, a-z, A-Z 再加上加號+ 及除號/ 組成 64 個字元。如果用在 url 裡面,會把 + 及 / 換成別的字,成為 base64 的變形。

在看過實例後,會發現有的 base64 後面會跟著等號 = 那是因為每次資料的 byte 數不一定是三的倍數。那麼少掉的 byte,就用等號來補。

那麼,base32,就是用 32 個字元來取代,也就是每 5 個 bit,就要用 1 個 byte 來表示。也就是 5 個 byte 的資料要 8 個 byte 來表示,資料變大成 1.6 倍,因此不常被使用。

那麼在 python 有兩個模組可以用 base64。一個是 base64 模組,一個是 binascii 模組。在 base64 模組提到它是遵照 RFC3548 來做的,演算法不同於 uuencode,所做出來的字串可以用在 e-mail 傳送任意資料,或是 http post 的一部份。在 html 內嵌圖片資源也是常常看見的。在這個模組也實做 base32 及 base16。

而在 binascii 這裡,有 a2b_base64(string) 及 b2a_base64(data) 兩個函式,非常簡單地就把該轉的轉完。

其實用哪個模組都可以,唯一要注意的是 binascii.b2a_base64(x) 的後面多了一個換行。所以轉成 base64 之後若拿來跟 base64.b64encode(s) 比對的話,要 strip 過才不會中招。

我自己常常遇到的應用是客戶把檔案轉成 base64 的字串放在 xml 裡(SOAP),我們再把它轉回來變檔案。

 

參考

[1] http://en.wikipedia.org/wiki/Base64

沒有留言:

張貼留言