Base64 Encoding

寫一篇Base64 Encoding Algorithm

= Base64, Why? =
有Base64的原因,是因為電腦內部(e.g. ASCII)是用8-bit 編碼的。但這些編碼大部份都不是 printable character,就是可以在螢幕上顯示的字。
將內部的8-bit,轉換成可以在螢幕上顯示的字,就是Base64最簡單的定義。

= Base64, How? =
== Base set ==
Base64之所以叫Base64,就是選用了64個printable的字作為編碼基組。
即是,任何Bit stream都可以以這64個字編碼後當printable的字來傳送。

64個字符選哪些,Base64 有多個不統一的implementation。一般最常用的是以A-Z, a-z, 0-9, +, /,這64個字符。
還有一個 = 作padding,下文再述。
Screen Shot 2013-09-12 at 10.13.58 AM

== Algorithm ==
1. 將byte 變成8個bit 的1010,排成bitstream。
2. 每6個bit 一組(2^6 = 64)。不足的尾數,補上零(0)。
3. 每6個bit 編碼成base64。
4. 如此,必定會形成了「每3個byte就編成4個base64」(3*8=4*6)。
5. base64結果的長度必需為4的倍數。不足處補上等號(=)。完成。

== Check ==
1. 要檢查一個Base64是否正確,其長度必然是4的倍數。
2. 尾部只會有三個可能。一是沒有=(即應是一個Base64的字符),二是有一個=,三是有兩個=。不會有兩個=以上或其他。因為,Base64的原理,是將3個byte編成4個base64。
3. 分析。若byte除以三後:
– 剩1:兩個=(1byte=8bit,補4個零12bit,編成兩個Base64,補上兩個=,成為四個一組Base64)
– 剩2:一個=(2byte=16bit,補2個零18bit,編成三個Base64,補上一個=,成為四個一組Base64)
– 除盡:無=

完。

= Supplementary =
留意有某些SDK implementation,會有在編碼中,插入了newline character的情況。只需要看Base64的總長是否4的倍數即可分辨。

發表留言