ホームページ >バックエンド開発 >PHPチュートリアル >Base64 カスタム エンコード テーブル PHP バージョン、_PHP チュートリアル
インターフェイスのドッキングでは、エンコードとデコードに Base64 カスタム エンコード テーブルを使用する必要があります。インターネットで検索したところ、その原則がより詳細で徹底的であることがわかりました。エンコードの例はありますが、デコードはありません。以下は、私が実装した Base64 カスタム辞書の例です。これは、アセンブリをテストした後、問題なく実行できます。まず、他の人のブログから原理を取得してください
Base64エンコードはプログラム開発でよく使われるエンコード方式です。これは、64 個の印刷可能な文字を使用してバイナリ データを表現することに基づいた表現方法です。通常、バイナリ データを保存および送信するためのエンコード方法として使用されます。これは、MIME (MultiPurpose Internet Mail Extensions、主に電子メール標準として使用される) の印刷可能文字で表されるバイナリ データの一般的なエンコード方法でもあります。実際には、印刷可能な文字を使用してコンテンツを送信する方法を定義しているだけであり、新しい文字セットを作成するわけではありません。場合によっては、変換の概念を学んだ後、実際のニーズに基づいて独自のインターフェイス定義コーディング方法を実際に構築できることがあります。さて、変換のアイデアを見てみましょう!
Base64実装の変換原理
64 個の印刷可能な文字を使用してすべてのバイナリ データを表す方法です。 2 の 6 乗は 64 に等しいため、6 ビットごとを、特定の印刷可能文字に対応する単位として使用できます。 3 バイトは 24 ビットであり、4 つの Base64 ユニットに対応できることがわかっています。つまり、3 バイトは 4 つの Base64 印刷可能文字で表す必要があります。 Base64 で印刷可能な文字には、文字 A ~ Z、a ~ z、および数字 0 ~ 9 が含まれるため、合計 62 文字になります。また、通常、2 つの印刷可能な記号はシステムによって異なります。ただし、よく参照される Base64 の他の 2 文字は「+/」です。この 64 文字の対応表は次のとおりです。
リーリー 変換中、3 バイトのデータが 24 ビット バッファに次々と入れられ、最初に来たバイトが上位ビットを占めます。データが 3 バイト未満の場合、バッファ内の残りのビットは 0 で埋められます。その後、毎回 6 ビットが取り出され、その値に応じて <br>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
内の文字がエンコードされた出力として選択されます。すべての入力データが変換されるまで続行します。
最後に入力データが 2 つ残っている場合は、エンコード結果の後に 1 つ「=」を追加します。最後に入力データが 1 つ残っている場合は、エンコード結果の後に 2 つ「=」を追加します。データ復元の正確性を確保するため、何も使用しないでください。
エンコードされたデータは元のデータよりわずかに長く、元のデータの 4/3 です。文字の種類に関係なく、すべての文字がエンコードされるため、Quoted-printable エンコードとは異なり、一部の印刷可能文字は保持されます。したがって、Quoted-printable エンコーディングほど読みやすくはありません。
テキスト | M | あ | ん | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII エンコード | 77 | 97 | 110 | |||||||||||||||||||||
バイナリビット | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
インデックス | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Base64エンコーディング | た | W | F | う |
M の ASCII コードは 77、最初の 6 桁は 19 に対応し、対応する Base64 文字は T などとなります。他の文字コードも自動変換可能!ちょうど 3 バイトではない別の状況を見てみましょう。
テキスト(1バイト) | A | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
バイナリビット | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | ||||||||||||||||
2進数(0の補数) | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | ||||||||||||
Base64エンコーディング | Q | Q | = | = | ||||||||||||||||||||
テキスト(2バイト) | B | C | ||||||||||||||||||||||
バイナリビット | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | × | × | × | × | × | × | ||
2進数(0の補数) | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | × | × | × | × | × | × |
Base64エンコーディング | Q | k | M | = |
この讲の很透彻、翻訳地址:http://www.cnblogs.com/chengmo/archive/2014/05/18/3735917.html
classbase64{
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);
}
public function array_index($t){
return array_search($t, $this->base64_config);
}
public function decode($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]<<2)|(($arr[1]&48)>>4);
$desc_1 = (($arr[1]&15)<< ;4)|(($arr[2]&60)>>2);
$desc_2 = (($arr[2]&3)<<6)|$arr[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]<< ;2;
if($desc_0 != 0) $desc = array_merge($desc,[$desc_0]);
}else if(count($arr) == 2) {
$desc_0 = ($arr[0] ]<<2)|(($arr[1]&48)>>4);
$desc = array_merge($desc,[$desc_0]);
}else if(count($arr) = = 3) {
$desc_0 = ($arr[0]gt;>4);
$desc_1 = ($arr[1]$desc = array_merge($desc,[$desc_0,$desc_1]);
}
return implode('', array_map(" chr",$desc));
}
public function encode($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)|($ byte_arr[$index_num+2]>>4);
$_dec2= (($byte_arr[$index_num+2]&0xF)<<2)|($byte_arr[$index_num+3]>> 6);
$_dec3= $byte_arr[$index_num+3]&63;
$desc = array_merge($desc,array($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)<<4);
$_dec2=$_dec3="!";
}else{
///2个字节
$_dec1= (($byte_arr[$ n]&3)<<4)|($byte_arr[$n+1]>>4);
$_dec2= $this->base64_config[($byte_arr[$n+1]&0xF)< ;<2];
$_dec3="!";
}
$desc = array_merge($desc,array($this->base64_config[$_dec0],$this->base64_config[$_dec1],$ _dec2,$_dec3));
return implode('',$desc);
}
}
$base64 = newbase64();
//echo array_search("E",$base64->base64_config);
//exit;
$tt = $base64->encode("中文那在场也不怕asdasdas23232323 、。、");
echo $ttt."
";
$ttt = $base64->decode($tt);
echo $ttt."
";