• 技术文章 >后端开发 >php教程

    base64自定义编码表 php版本

    2016-07-29 09:09:14原创447
    在一次接口对接中,要用到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个字符,所对应表如下。

    编号字符 编号字符 编号字符 编号字符
    0A16Q32g48w
    1B17R33h49x
    2C18S34i50y
    3D19T35j51z
    4E20U36k520
    5F21V37l531
    6G22W38m542
    7H23X39n553
    8I24Y40o564
    9J25Z41p575
    10K26a42q586
    11L27b43r597
    12M28c44s608
    13N29d45t619
    14O30e46u62+
    15P31f47v63/

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

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

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

    文本Man
    ASCII编码7797110
    二进制位010011010110000101101110
    索引1922546
    Base64编码TWFu

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

    文本(1 Byte)A
    二进制位01000001
    二进制位(补0)010000010000
    Base64编码QQ==
    文本(2 Byte)BC
    二进制位0100001001000011 xxxxxx
    二进制位(补0)010000100100001100xxxxxx
    Base64编码QkM =

    这个讲的很透彻,原文地址:http://www.cnblogs.com/chengmo/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);
    }
    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."
    ";
    $ttt = $base64->decode($tt);
    echo $ttt."
    ";

    以上就介绍了base64自定义编码表 php版本,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:nbsp desc arr array base64
    上一篇:PHP面向对象编程之深入理解方法重载与方法覆盖(多态) 下一篇:深入浅析php json 格式控制
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 用PHP来统计在线人数的四个方法详解• win7 php solr解决办法 • :怎么限定来自某页的提交 • php批改表单中的内容不成功 • 为什么这段代码调试的时候提示上载?
    1/1

    PHP中文网