Base64編碼原理分析與PHP實現

來源:互聯網
上載者:User
Base64是一種基於64個可列印字元來表示位元據的表示方法。由於2的6次方等於64,所以每6個為一個單元,對應某個可列印字元。

三個bites有24個位元,對應於4個Base64單元,即3個位元組需要用4個可列印字元來表示。它可用來作為電子郵件的傳輸編碼。

在Base64中的可列印字元包括字母A-Z、a-z、數字0-9,這樣共有62個字元,此外兩個可列印符號在不同的系統中而不同。

如在mime(多用途郵件擴充)中,Base64的使用的64個可列印字元

A-Za-z:大小寫字母各26個

0-9:加上10個數字

+:加號

/:斜杠

一共64個字元,等號“=”用來作為尾碼用途

對應的轉換關係為

0-63:A-Za-z0-9+/


轉換的時候,將三個byte的資料,先後放入一個24bit的緩衝區中,先來的byte占高位。資料不足3byte的話,於緩衝器中剩下的bit用0補足。然後,每次取出6(因為26=64)個bit,按照其值選擇ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字元作為編碼後的輸出。不斷進行,直到全部輸入資料轉換完成。

當原資料長度不是3的整數倍時, 如果最後剩下一個輸入資料,在編碼結果後加2個“=”;如果最後剩下兩個輸入資料,編碼結果後加1個“=”;如果沒有剩下任何資料,就什麼都不要加,這樣才可以保證資料還原的正確性。

執行個體分析:

編碼:"Lailaiji"

通過查ASCII表找到對應關係

L:0x4c | a:0x61 | i:0x69 | l:0x6C | j:0x6A

因此轉換成二進位為:0100 1100 , 0110 0001 , 0110 1001 , 0110 1100 , 0110 0001 , 0110 1001 , 0110 1010 , 0110 1001

第一步:先取三個位元組的資料即:0100 1100 , 0110 0001 , 0110 1001,然後從這個三位元組中取出6位即010011,在最高位補充兩個位00使其成為1個byte,即0001 0011,剩餘的18位也如此迴圈,最終這三個位元組將擴充成為4個位元組即:0001 0011, 0000 0110, 0000 0101, 0010 1001

第二步,從剩餘的位元組序列中再重複第一步,走到小於3個位元組

第三步,這時剩餘位元組為:0110 1010,0110 1001不足3個位元組,需要在從低位以0進行補充,即成0110 1010,0110 1001,0000 0000重複第一步,得到:0001 1010,0010 0110, 0010 0100, 0000 0000,

經過以後的運算後,我們將得到一組位序列:

0001 0011, 0000 0110, 0000 0101, 0010 1001

0001 1011,0000 0110, 0000 0101, 0010 1001

0001 1010,0010 0110, 0010 0100, 0000 0000

轉換成十進位為:19,6,5,41,27,6,5,41,26,38,36,0

對應的字元為:T,G,F,p,b,G,F,p,a,m,k,A

特別注重的是,最後一個位元組0000 0000即0x00,通過查表為A,由於最後這8位是補充的,所以它應當被轉換成=號,而不是A

因此:最終結果為:TGFpbGFpamk=

PHP實現:

encode($input);echo "Encode:",$output.PHP_EOL;$output = $obj->decode($output);echo "Decode:",$output.PHP_EOL;class MyBase64{private $_table = array();private $_revtable = array();public function __construct(){$this->_initTable();}public function decode($string){$orign_len = strlen($string);$j = 0;$ret = null;for($i=0; $i<$orign_len; $i+=4){$chr1 = $this->getRevChr($string[$i]);$chr2 = $this->getRevChr($string[$i+1]);$chr3 = $this->getRevChr($string[$i+2]);$chr4 = $this->getRevChr($string[$i+3]);$_chr1 = $chr1<<2 | ($chr2&0x3F) >>4;$_chr2 = ($chr2&0x0F)<<4 | ($chr3&0xFC) >>2;$_chr3 = ($chr3&0x03)<<6 | $chr4;$ret .= chr($_chr1);$ret .= chr($_chr2);$ret .= chr($_chr3);}$ret = rtrim($ret);return $ret;}private function getRevChr($chr){if(isset($this->_revtable[$chr])){return $this->_revtable[$chr];}else{return 0;}}public function _decode($string){$orign_len = strlen($string);$de = null;$kv = array_flip($this->_table);$b  = null;for($i = 0 ;$i < $orign_len;$i++){$chr = $string[$i];if($chr != '='){$c = $kv[$chr];}else{$c = chr(0);}printf("%x",$c);$b[] = pack('C',$c);echo PHP_EOL;}for($i = 0 ;$i < count($b);$i+=3){$ch1 = ($b[$i]<<2) | ($b[$i+1]>>4);$ch2 = ($b[$i+1]<<4) | ($b[$i+2]>>2);$ch3 = ($b[$i+2]<<6) | ($b[$i+3]);printf('%08b,%08b,%08b',$ch1,$ch2,$ch3);echo PHP_EOL;printf('%08b,%08b',($b[$i]<<2) , ($b[$i+1]>>4));echo PHP_EOL;}}public function encode($string){$orign_len = strlen($string);$len       = intval(ceil($orign_len/3)*3);$bin       = pack('a'.$len,$string);$gen       = null;for($i=0; $i<$len; $i+=3){$ch1 = ord($bin[$i]) >> 2;$ch2 = ((ord($bin[$i]) & 0x03) << 4) | (ord($bin[$i+1]) >> 4);$ch3 = ((ord($bin[$i+1]) & 0x0F) << 2) | ((ord($bin[$i+2]) & 0xC0) >> 6);$ch4 = ord($bin[$i+2]) & 0x3F;$gen.= $this->_table[$ch1];$gen.= $this->_table[$ch2];$gen.= $this->_table[$ch3];$gen.= $this->_table[$ch4];}if($orign_len-$len){$gen = substr($gen,0, -abs($orign_len-$len));for($i=0;$i<$len-$orign_len;$i++){$gen .= '=';}}return $gen;}private function  _initTable(){$tbl = array();for($i=ord('A');$i<=ord('Z');$i++){$tbl[] = chr($i);}for($i=ord('a');$i<=ord('z');$i++){$tbl[] = chr($i);}for($i=ord('0');$i<=ord('9');$i++){$tbl[] = chr($i);}$tbl[]           = '+';$tbl[]           = '/';$reverse         = array_flip($tbl);$this->_table    = $tbl;$this->_revtable = $reverse;}}
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.