首頁 > 後端開發 > php教程 > base64自訂編碼表 php版本

base64自訂編碼表 php版本

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-07-29 09:09:14
原創
1071 人瀏覽過

在一次介面對接中,要用到base64自訂編碼表來進行編碼和解碼,從網上搜尋了一下,講原理的比較多也比較透徹,提供的編碼的例子但是沒有解碼的,以下是自己實現的一個base64自訂字典解碼的例子,比較粗糙,測試過集會應該沒有問題,需要這塊的可以拿去看一下,先將別人博客將原理的拿過來

Base64編碼,是我們程序開發中經常使用到的編碼方法。它是一種基於用64個可列印字元來表示二進位資料的表示方法。它通常用作儲存、傳輸一些二進位資料編碼方法!也是MIME(多用途互聯網郵件擴展,主要用作電子郵件標準)中一種可列印字元表示二進位資料的常見編碼方法!它其實只是定義用可列印字元傳輸內容一種方法,並不會產生新的字元集!有時候,我們學習轉換的思維後,其實也可以結合自己的實際需要,建構一些自己介面定義編碼方式。好了,我們一起看看,它的轉換思路吧!

Base64實現轉換原理

    它是用64個可列印字元表示二進位所有資料方法。由於2的6次方等於64,所以可以用每6個位元為一個單元,對應某個可列印字元。我們知道三個位元組有24個位元,就可以剛好對應4個Base64單元,也就是3個位元組需要用4個Base64的可列印字元來表示。在Base64中的可列印字符包括字母A-Z、a-z、數字0-9 ,這樣共有62個字符,此外兩個可列印符號在不同的系統中一般有所不同。但是,我們常所說的Base64另外2個字元是:「+/」。這64個字符,所對應表如下。

0A16Q 32g48w1B172C18S 34i50y3D193D2016G 22W38m54274057510K26a42q586r597 12M28c44s608O63
編號   編號  
4 E
U 36 k 52 0 5 F
55 3 8 I 24 Y
o 56 4
45 t 61 9 14
30 e 46 u 62 f 47 v
/

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

    如果最後剩下兩個輸入數據,在編碼結果後加1個「=」;如果最後剩下一個輸入數據,編碼結果後加2個「=」;如果沒有剩下任何數據,就什麼都不要加,這樣才可以保證資料還原的正確性。

    編碼後的資料比原始資料略長,為原來的4/3。無論什麼樣的字元都會全部被編碼,因此不像Quoted-printable 編碼,也保留部分可列印字元。所以,它的可讀性不如Quoted-printable編碼!

號0101110索引192254646Fu文字(1 Byte)A  二進位0
文字 M a n
ASCII9710% 0 1 0
1 1 0 1 0 1 1 0 0 22 5
     M的Ascii碼是77,前六位對應值為19,對應base64字元是T,如此類推。其它字符編碼就可以自動轉換得到!我們看看另外不是剛好是3個位元組的情況!
0
1

    00001000         010000100100  xx xxxx二進位(補0)0100100
       
        二進位(補0) 0 1 0 
  Base64編碼 Q Q = =
0 0 1 0 0 0 0 1 1 0 0 1 0 0 x Base64編碼 Q k M  =

這個講的很透徹,譯文網址:http://www.cnblogs.com/hengmo/archive/2014/05/18/3735917.html

class base64{
public $base64_config = [. A'、'B'、'C'、'D'、'E'、'F'、'G'、'H'、'I'、'J'、'K'、'L'、'M ' ,'N','O','P','Q','R','S','T','U','V','W','X','Y', ' Z','a','b','c','d','e','f','g','h','i','j','k','l ' ,'m','n','o','p','q','r','s','t','u','v','w','x', ' y','z','0','1','2','3','4','5','6','7','8','9','_ ' ,'-'];
public function getBytes($string) { 
$data = iconv("UTF-8","GBK",$string);
return unpack("C*",$data);
}
公用函數array_index($t){
return array_search($t, $this->base64_config);
}
公用函數解碼($str){
$str = str_replace("!","",$ str) ;
$slen = strlen($str);
$mod = $slen%4;
$num = Floor($slen/4);
$desc = [];
for($i=0;$ i$arr = array_map("base64::array_index",str_split(substr($str,$i*4,4)));
$desc_0 = ($arr[0]< ;>4);
$desc_1 = (($arr[1]&15)>2);
$desc_2 = (($arr[2]&3)$desc = array_merge($desc,[$desc_0,$desc_1, $desc_2]);
}
if($ mod == 0) return implode('', array_map("chr",$desc));
$arr = array_map("base64::array_index", str_split(substr( $str,$num*4,4)) );
if(count($arr) == 1) {
$desc_0 = $arr[0]if($desc_0 != 0) $desc = array_merge($desc,[$desc_0]) ;
}else if(count($arr) == 2) {
$desc_0 = ($arr[0]>4);
$desc = array_merge ($desc,[$desc_0]);
}else if(count($arr) == 3) {
$desc_0 = ($arr[ 0] >4);
$desc_1 = ($arr[1]>2);
$desc = array_merge($desc,[$desc_0,$desc_1]) ;
}
return implode('', array_map("chr",$desc));
}
public函數編碼($str){
$byte_arr = $this->getBytes($str);
$slen= count($byte_arr);
$smod = ($slen%3);
$snum = Floor($ slen/3);
$desc = array();
for($i=1;$i$index_num = ($i-1)*3;
$_dec0= $ byte_arr[$index_num+1]>>2;
$_dec1= (($byte_arr[$index_num+1]&3 )>4 );
$_dec2= (($byte_arr[$index_num+2]&0xF)>6); 
$_dec3= $byte_arr[$index_num+3]&63;
$desc = array_merge($desc,array($this->base64_config[$_dec0],$this->base64_config[$this->base64_config[$_dec0],$this->base64_config[$_dec1], $this- >base64_config[$_dec2],$this->base64_config[$_dec3]));
}
if($smod==0) return implode('',$desc);
$n = ($snum * 3)+1;
$_dec0= $byte_arr[$n]>>2;
///只有一個位元組
if(!isset($byte_arr[$n+1])){
$_dec1= ( ($byte_arr[$n]&3)$_dec2=$_dec3="!";
}else{
///2個位元組
$_dec1= (($byte_arr[$ n]&3 )>4);
$_dec2= $this->base64_config[($byte_arr[$n+1]&0xF)< ;$_dec3 ="!";
}
$desc = array_merge($desc,array($this->base64_config[$_dec0],$this->base64_config[$_dec1],$ _dec2,$_dec3));
return implode( '',$desc);
}
}

$base64 = new base64();
//echo array_search("E",$base64->base64_config);
//退出;
>encode("中文那在場也不怕asdasdas23232323,。 、");
echo $tt."
";
$ttt = $base64- >解碼($tt);
回顯$ttt。"
";

以上就介紹了base64自訂編碼表php版本,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
javascript - js正規符合特定字串
來自於 1970-01-01 08:00:00
0
0
0
為什麼說非物件呼叫成員函數fetch()
來自於 1970-01-01 08:00:00
0
0
0
資料庫設定檔必須要用二維數組
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板