標準的Base64演算法描述,base64演算法描述
作者:zhanhailiang 日期:2014-12-19
演算法描述:
Base64要求把每三個8Bit的位元組轉換為四個6Bit的位元組(38 = 46 = 24),然後把6Bit再添兩位高位0,組成四個8Bit的位元組,也就是說,轉換後的字串理論上將要比原來的長1/3。
- 第一個字元通過右移2位獲得第一個目標字元的Base64表位置,根據這個數值取到表上相應的字元,就是第一個目標字元。
- 然後將第一個字元與0x03(00000011)進行與(&)操作並左移4位,接著第二個字元右移4位與前者相或(|),即獲得第二個目標字元。
- 再將第二個字元與0x0f(00001111)進行與(&)操作並左移2位,接著第三個字元右移6位與前者相或(|),獲得第三個目標字元。
- 最後將第三個字元與0x3f(00111111)進行與(&)操作即獲得第四個目標字元。
在以上的每一個步驟之後,再把結果與 0x3F 進行 AND 位操作,就可以得到編碼後的字元了。
剩餘的位元組根據編碼規則繼續單獨轉(1變2,2變3;不夠的位元用0補全),再用=號補滿4個位元組。這就是為什麼有些Base64編碼會以一個或兩個等號結束的原因,但等號最多隻有兩個。因為:
一個原位元組至少會變成兩個目標位元組
所以餘數任何情況下都只可能是0,1,2這三個數中的一個。如果餘數是0的話,就表示原文位元組數正好是3的倍數(最理想的情況)。如果是1的話,轉成2個Base64編碼字元,為了讓Base64編碼是4的倍數,就要補2個等號;同理,如果是2的話,就要補1個等號。
以上演算法描述引用自:http://baike.baidu.com/link?url=lriFEiUvmROqg0a0R0DZS0t8gEmIQRnJ13eSGZuYFFOyUDSrhY824dE7zjTbhSA5rpp2NiDn2-mCoLPbPlY1q_#3_3
演算法實現:
從PHP/ext/standard/base64.c中剝離出base64_encode的實現方法,代碼如下:https://github.com/billfeller/billfeller.github.io/tree/master/code/base64
測試:
[root@~/wade/git/billfeller.github.io/code/base64]# gcc -o base64 base64.c [root@~/wade/git/billfeller.github.io/code/base64]# ./base64 "abcd*"YWJjZCo=[root@~/wade/git/billfeller.github.io/code/base64]# /usr/local/php/bin/php -r 'echo base64_encode("abcd*").PHP_EOL;'YWJjZCo=