php base64编码 加解密 手动实现


base64编码原理

GB_2312 字符集是目前最常用的汉字编码标准。在这个标准中,每个汉字用2个字节来表示,每个字节的ascii码为 161-254 (16 进制A1 - FE),第一个字节 对应于 区码的1-94 区,第二个字节 对应于位码的1-94 位。

汉字的unicode 编码范围为 \u4e00 ~ \u94a5

UTF-8 字符集中一个汉字站三个字节: 参考链接
<?php
header("charset=utf-8");
$str = "Mn一丁丂七丄丅丆万丈丌啊";
echo $base = base64_encode($str);
echo "<br/>";
echo base64_decode($base);
echo "<hr/>";
$code = encode64($str);
echo $code,"<br/>";
echo $decode = decode64($code);

function encode64($str){
    $base64 = implode("",range('A','Z')).implode("",range('a','z')).implode("",range('0','9'))."+/";
    if($str=="") return false;
    $binStr = StrToBin($str);
    $more = 0;
    $encodeStr = "";
    for($i=0;$i<strlen($binStr);$i+=6){
        if($more == 4) $more = 0;
        $more++;
        $bin6 = substr($binStr,$i,6);
        if(strlen($bin6)<6){
            $bin6 .= str_repeat("0",6 - strlen($bin6));
        }
        $index = base_convert($bin6, 2, 10);
        $encodeStr .= $base64{$index};
    }
    return $encodeStr.str_repeat("=",4 - $more);
}
function decode64($str){
    $base64 = implode("",range('A','Z')).implode("",range('a','z')).implode("",range('0','9'))."+/";
    if($str=="") return false;
    $more = substr_count($str, "=");
    $str = substr($str,0,strlen($str)-$more);
    $arr = str_split($str);
    $binStr = "";
    //base64 到 6个二进制还原
    foreach($arr as $val){
        $index = strpos($base64,$val);
        $bin6 = base_convert($index, 10, 2);
        $binStr .= str_repeat("0",6-strlen($bin6)).$bin6;
    }
    //6 => 8 二进制还原
    $binStr = substr($binStr,0,strlen($binStr)-$more*2);
    return BinToStr($binStr);
}

function StrToBin($str){
    $arr = preg_split("/(?<!^)(?!$)/u",$str);
    $binStr = "";
    foreach($arr as $v){
        $hex = unpack("H*",$v);
        $bin8 = base_convert($hex[1], 16, 2);
        $mod = 8 - fmod(strlen($bin8),8);
        if($mod > 0 && $mod < 8)
            $bin8 = str_repeat("0",$mod).$bin8;

        $binStr .= $bin8;
    }
    return $binStr;
}

function BinToStr($str){
    $binArr = array();$index=0;$index2=0;
    for($i=0;$i<strlen($str);$i+=8){
        $bin8 = substr($str,$i,8);
        if($bin8{0}==0){
            $bin8 = preg_replace("/^0+/", " ", $bin8);
            $binArr[$index] = $bin8;
            $index++;
        }else{
            if($index2==0){
                $binArr[$index] = " ".$bin8;
                $index2++;
            }else{
                $binArr[$index] .= $bin8;
                $index2++;
                if($index2==3){
                    $index2=0;
                    $index++;
                }
            }
        }
    }
    $deArr = array();
    foreach($binArr as $k=>$v){
        $hex = base_convert($v, 2, 16);
        $v = pack("H".strlen($hex),$hex);
        $deArr[$k] = $v;
    }
    return join("",$deArr);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值