图集1/3

正文 4352字数 128,821阅读

在一次接口对接中,要用到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个字符,所对应表如下。

转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。

如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

编码后的数据比原始数据略长,为原来的4/3。无论什么样的字符都会全部被编码,因此不像Quoted-printable 编码,还保留部分可打印字符。所以,它的可读性不如Quoted-printable编码!

M的Ascii码是77,前六位对应值为19,对应base64字符是T,如此类推。其它字符编码就可以自动转换得到!我们看看另外不是刚好是3个字节的情况!

这个讲的很透彻,原文地址:
http://www.cnblogs.com/chengmo/archive/2014/05/18/3735917.html
Run code
Cut to clipboard

    <?php 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); } 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<$num;$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]<<2)|(($arr[1]&48)>>4); $desc_1 = ($arr[1]<<4)|(($arr[2]&60)>>2); $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<=$snum;$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."<br/>"; $ttt = $base64->decode($tt); echo $ttt."<br/>";
    Run code
    Cut to clipboard