php实现encode64编码类实例
本文实例讲述了php实现encode64编码类。分享给大家供大家参考。具体如下:
encode64可以获得最短的由26个英文大小写字母数字加上"-_"两个符号编码的数据,这个个字串可以在网络自由传输,无需考虑被自动转码引起的混乱.缺点:对于大字串太慢了,原因不明,可能PHP脚本本身就是慢,所以它内置很多函数,这些函数如果用脚本来实现是不可忍受的.而JavaScript就没这个问题,脚本的速度快的多.
<?PHP
//encode64编码可以同时取代encodeURI,encodeURIComponent,endode函数
//因为选取的这些字符都不会被编码.
classEncode64{
functioncode($str){
$KEY='PaAwO65goUf7IK2vi9-xq8cFTEXLCDY1Hd3tV0ryzjbpN_BlnSs4mGRkQWMZJeuh';
$a=StrToBytes($str);
$len=count($a);
$res=$len%3;
$s="";$i=2;$v=0;
for(;$i<$len;$i+=3){
$v=$a[$i-2]+($a[$i-1]<<8)+($a[$i]<<16);
$s.=$KEY[$v&0x3f];
$s.=$KEY[($v>>6)&0x3f];
$s.=$KEY[($v>>12)&0x3f];
$s.=$KEY[($v>>18)];
}
if($res==1){
$v=$a[$i-2];
$s.=$KEY[$v&0x3f];
$s.=$KEY[($v>>6)&0x3f];
}elseif($res==2){
$v=$a[$i-2]+($a[$i-1]<<8);
$s.=$KEY[$v&0x3f];
$s.=$KEY[($v>>6)&0x3f];
$s.=$KEY[($v>>12)&0x3f];
}
return$s;
}
functiondecode($codeStr){
$KEY='PaAwO65goUf7IK2vi9-xq8cFTEXLCDY1Hd3tV0ryzjbpN_BlnSs4mGRkQWMZJeuh';
$dic=array();
for($i=0;$i<64;$i++){
$dic[$KEY[$i]]=$i;
}
$len=strlen($codeStr);
$res=$len%4;
$cLen=floor($len/4)*3;
if($res==2)$clen+=1;
elseif($res==3)$clen+=2;
$code=range(0,$clen);
$i=3;$v=0;$j=0;
for(;$i<$len;$i+=4){
$v=$dic[$codeStr[$i-3]];
$v+=$dic[$codeStr[$i-2]]<<6;
$v+=$dic[$codeStr[$i-1]]<<12;
$v+=$dic[$codeStr[$i]]<<18;
$code[$j]=$v&0xff;
$code[$j+1]=($v>>8)&0xff;
$code[$j+2]=($v>>16)&0xff;
$j+=3;
}
if($res==2){
//正确的字节数肯定是余2或3,没有1的情况,如果出现,舍弃.
$v=$dic[$codeStr[$i-3]];
$v+=$dic[$codeStr[$i-2]]<<6;
$code[$j]=$v&0xff;
}elseif($res==3){
$v=$dic[$codeStr[$i-3]];
$v+=$dic[$codeStr[$i-2]]<<6;
$v+=$dic[$codeStr[$i-1]]<<12;
$code[$j]=$v&0xff;
$code[$j+1]=($v>>8)&0xff;
}
returnBytesToStr($code);
}
}
functionBytesToStr($bytes){
$str='';
foreach($bytesas$ch){
$str.=chr($ch);
}
returniconv('UTF-16BE','utf-8',$str);
}
functionStrToBytes($str){
$str=iconv('utf-8','UTF-16BE',$str);
$len=strlen($str);
$bytes=array();
for($i=0;$i<$len;$i++){
$bytes[]=ord($str[$i]);
}
return$bytes;
}
?>
希望本文所述对大家的php程序设计有所帮助。