ホームページ >バックエンド開発 >PHPチュートリアル >Base64 カスタム エンコーディング テーブルの PHP バージョン
インターフェイスのドッキングでは、エンコードとデコードに 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 文字の対応表は次のとおりです。
番号 文字 番号 文字 番号 文字 番号 文字 0 A 16 Q 32 g 48 w 1 B 17 R 33 h 49 x 2 C 18 S 34 i 50 y 3 D 19 T 35 j 51 z 4 E 20 U 36 k 52 0 5 F 21 V 37 l 53 1 6 G 22 W 38 m 54 2 7 H 23 X 39 n 55 3 8 私 24 Y 40 o 56 4 9 J 25 Z 41 p 57 5 10 K 26 a 42 q 58 6 11 L 27 b 43 r 59 7 12 M 28 c 44 s 60 8 13 N 29 d 45 t 61 9 14 O 30 e 46 u 62 + 15 P 31 f 47 v 63 / 変換時、3 バイトのデータが 24 ビット バッファに順番に入れられ、最初に来たバイトが上位ビットを占めます。データが 3 バイト未満の場合、バッファ内の残りのビットは 0 で埋められます。次に、一度に 6 ビットを取り出し、その値に従って
<br>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
内の文字をエンコードされた出力として選択します。すべての入力データが変換されるまで続行します。最後に入力データが 2 つ残っている場合は、エンコード結果の後に 1 つ「=」を追加します。最後に入力データが 1 つ残っている場合は、エンコード結果の後に 2 つ「=」を追加します。データ復元の正確性を確保するため、何も追加しないでください。
エンコードされたデータは元のデータよりわずかに長く、元のデータの 4/3 です。文字の種類に関係なく、すべての文字がエンコードされるため、Quoted-printable エンコードとは異なり、一部の印刷可能文字は保持されます。したがって、Quoted-printable エンコーディングほど読みやすくはありません。
テキスト M a n 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エンコーディング T W F u M's The ASCII コードは 77、最初の 6 桁は 19 に対応し、対応する Base64 文字は T などとなります。他の文字コードも自動変換可能!ちょうど 3 バイトではない別の状況を見てみましょう。
テキスト(1バイト) A バイナリビット 0 1 0 0 0 00 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 x x x x 0 0 1 0 0 0 0 1 1 0 0 × x x x x x 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);
}
パブリック関数 array_index($t){
return array_search($t, $this->base64_config);
}
パブリック関数 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]< ;gt;>4);
$desc_1 = (($arr[1]&15)$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]$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 = new Base64();
//echo array_search("E",$base64->base64_config);
//exit;
$tt = $base64->encode("中文那在场も不怕asdasdas23232323,。、");
echo $tt."
";
$ttt = $base64- >デコード($tt);
エコー $ttt."
";以上、base64 独自のコード表 php バージョンを紹介しました。側面の内容が含まれており、PHP 教則に関心のある友人の助けになることを望みます。