malike 发表于 2018-2-11 11:58:28


            本文实例讲述了PHP进制转换。分享给大家供大家参考,具体如下:
可以实现:
10进制转换2、8、16、36、62进制
2、8、16、36、62进制转换10进制
有点要注意下,2、8、16进制转换时,使用的是系统的自己的函数。
所以,不管怎么高精度转换值可能大于2147483646。
另外,
32进制低精转换,最大值:2147483646;
32进制高精转换,最大值:77309411327;
64进制高精转换,最大值:133143986175。
jinzhi.php文件,自带演示功能。
进制转换/title>





2
8
10
16
36
62

进制



进行
普通高精


转换为

   2
   8
   10
   16
   36
   62
进制,总长度为

字符。



注意:仅能进行10进制转换为2、8、16、36、62进制;或反转换。
=10)
   {
   $zifu.= chr(($linshi+55));
   }else{
      $zifu.= $linshi;}
   break;
    case 62:
   if (($linshi>=10) && ($linshi36)) {$zifu.= chr($linshi+55);break;}
   if (($linshi>=36) && ($linshi62)) {$zifu.= chr($linshi+61);break;}
   $zifu.= $linshi;break;
   default:
   $zifu.= $linshi;
   break;
   }
   $shu = intval($shu/$jinzhi);
   }
   for ($i=strlen($zifu);$i$w;$i++)
   $zifu.="0";
return strrev($zifu);}
   //2、8、16、36、62进制转10进制
   function jinzhih_1($zifu,$jinzhi,$w)
{ $shu=0;
for ($i=0;$i=strlen($zifu)-1;$i++)
   {
   $linshi = substr($zifu,$i,1);
   switch ($jinzhi){
      case 2:
       $shu = bindec($zifu);
       $i=strlen($zifu)+1;
       break;
      case 8:
       $shu = octdec($zifu);
      $i=strlen($zifu)+1;
      break;
      case 16:
       $shu = hexdec($zifu);
       $i=strlen($zifu)+1;
       break;
   case 36:
      if (ord($linshi)=57)
      {$shu+=(ord($linshi)-48)*pow($jinzhi,strlen($zifu)-$i-1);
   }else{
       $shu=$shu + (ord($linshi)-55)*pow($jinzhi,strlen($zifu)-$i-1);}
       break;
   case 62:
      if (ord($linshi)=57)
      {$shu+=$linshi*pow($jinzhi,strlen($zifu)-$i-1);   
   }elseif ((ord($linshi)>=65) && (ord($linshi)=90)){
      $shu+= (ord($linshi)-55)*pow($jinzhi,strlen($zifu)-$i-1);
      }else{
      $shu+= (ord($linshi)-61)*pow($jinzhi,strlen($zifu)-$i-1);}
      break;
   }
   }
   return $shu;
   }
   //10进制高精度转换2、8、16、36、62进制
   function jinzhih_G0($shu,$jinzhi,$w)
   {
   $zifu = "";
   while ($shu!=0){
   $linshi = bcmod($shu,$jinzhi);
   switch ($jinzhi){
    case 2:
   $zifu = decbin($shu);
   return $zifu;
    case 8:
   $zifu = decoct($shu);
   return $zifu;
    case 16:
   $zifu = dechex($shu);
   return $zifu;
    case 36:
   if ($linshi>=10)
   {
   $zifu.= chr(($linshi+55));
   }else{
      $zifu.= $linshi;}
   break;
    case 62:
   if (($linshi>=10) && ($linshi36)) {$zifu.= chr($linshi+55);break;}
   if (($linshi>=36) && ($linshi62)) {$zifu.= chr($linshi+61);break;}
   $zifu.= $linshi;break;
   default:
   $zifu.= $linshi;
   break;
   }
   $shu = intval(bcdiv($shu,$jinzhi));
   }
   for ($i=strlen($zifu);$i$w;$i++)
   $zifu.="0";
return strrev($zifu);}
   //2、8、16、36、62进制高精度转换10进制
   function jinzhih_G1($zifu,$jinzhi,$w)
{ $shu= "";
for ($i=0;$i=strlen($zifu)-1;$i++)
   {
   $linshi = substr($zifu,$i,1);
   switch ($jinzhi){
      case 2:
       $shu = bindec($zifu);
       $i=strlen($zifu)+1;
       break;
      case 8:
       $shu = octdec($zifu);
      $i=strlen($zifu)+1;
      break;
      case 16:
       $shu = hexdec($zifu);
       $i=strlen($zifu)+1;
       break;
   case 36:
      if (ord($linshi)=57)
      {$shu=bcadd($shu,bcmul((ord($linshi)-48),bcpow($jinzhi,strlen($zifu)-$i-1)));
   }else{
       $shu=bcadd($shu,bcmul((ord($linshi)-55),bcpow($jinzhi,strlen($zifu)-$i-1)));}
       break;
   case 62:
      if (ord($linshi)=57)
      {$shu=bcadd($shu,bcmul($linshi,bcpow($jinzhi,strlen($zifu)-$i-1)));
   }elseif ((ord($linshi)>=65) && (ord($linshi)=90)){
      $shu=bcadd($shu,bcmul((ord($linshi)-55),bcpow($jinzhi,strlen($zifu)-$i-1)));
      }else{
      $shu=bcadd($shu,bcmul((ord($linshi)-61),bcpow($jinzhi,strlen($zifu)-$i-1)));
      }
      break;
   }
   }
   return $shu;}
}
if (isset($_GET["p"]))
{if ($_GET["p"]==="1"){
echo "";
echo "提示:
";
echo "32进制低精转换,最大值:2147483646
";
echo "32进制高精转换,最大值:77309411327
";
echo "64进制高精转换,最大值:133143986175
";
echo "";
echo "值为:";
$Fs = new jinzhi_class();
if ($_POST['lx']=="0" && $_POST['jinzhi0']=="10")
{echo $Fs->jinzhih_0($_POST['zhi'],$_POST['jinzhi1'],$_POST['changdu'])."
";}
if ($_POST['lx']=="1" && $_POST['jinzhi0']=="10")
{echo $Fs->jinzhih_G0($_POST['zhi'],$_POST['jinzhi1'],$_POST['changdu']);}
if ($_POST['lx']=="0" && $_POST['jinzhi0']>"10")
{echo $Fs->jinzhih_1($_POST['zhi'],$_POST['jinzhi0'],$_POST['changdu']);}
if ($_POST['lx']=="1" && $_POST['jinzhi0']>"10")
{echo $Fs->jinzhih_G1($_POST['zhi'],$_POST['jinzhi0'],$_POST['changdu']);}
}
echo "";}
$mtime1 = explode(" ", microtime());
$endTime = $mtime1 + $mtime1;
printf ("页面执行时间:%.6fs.",$endTime-$startTime);
?>
页: [1]
查看完整版本: PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)