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

    PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)

    高洛峰高洛峰2017-02-06 15:58:29原创809
    本文实例讲述了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文件,自带演示功能。

    <?php
    $mtime1 = explode(" ", microtime());
    $startTime = $mtime1[0] + $mtime1[1];
    ?>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>进制转换/title>
    </head>
    <body>
    <form id="jzh" name="jinzhih" method="post" action="">
    <input name="go" type="hidden" value="100">
    <table width="482" border="1" cellpadding="0" cellspacing="0" bordercolor="#FFE8E8" bgcolor="#F4F8FB">
     <tr>
      <td width="194"><select name="jinzhi0" id="jinzhi0">
      <option value="2">2</option>
      <option value="8">8</option>
      <option value="10" selected="selected">10</option>
      <option value="16">16</option>
      <option value="36">36</option>
      <option value="62">62</option>
      </select>
    进制</td>
     <td width="275"><input name="zhi" type="text" id="zhi" /></td>
     </tr>
     <tr>
      <td>进行<input name="lx" type="radio" value="0" checked="checked" />
    普通<input type="radio" name="lx" value="1" />高精</td><td> </td>
     </tr>
     <tr>
      <td>转换为
      <select name="jinzhi1" id="jinzhi1">
       <option value="2" selected="selected">2</option>
       <option value="8">8</option>
       <option value="10">10</option>
       <option value="16">16</option>
       <option value="36">36</option>
       <option value="62">62</option>
      </select>进制,</td><td>总长度为
      <input name="changdu" type="text" id="changdu" value="10" size="4" maxlength="2" />
    字符。</td></tr><tr>
     <td><input type="submit" name="Submit" value="提交" /></td>
     <td><input type="reset" name="Submit2" value="重置" /></td>
     </tr></table>
     <p>注意:仅能进行10进制转换为2、8、16、36、62进制;或反转换。</p></form>
    <?php
    class jinzhi_class
    {
       //10进制转2、8、16、36、62进制
       function jinzhih_0($shu,$jinzhi,$w)
       {
       $zifu = "";
       while ($shu!=0){
       $linshi = $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($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[0] + $mtime1[1];
    printf ("页面执行时间:%.6fs.",$endTime-$startTime);
    ?>

    希望本文所述对大家PHP程序设计有所帮助。

    更多PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)相关文章请关注PHP中文网!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP 进制 转换
    上一篇:php将一维数组转换为每3个连续值组成的二维数组 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文带你了解PHP中的文件与目录操作• 关于exec函数的返回值有关问题 • PHP的类自动加载机制_PHP教程• 限制上传文件类型程序代码_PHP教程• php邮件发送,php发送邮件的类_PHP教程
    1/1

    PHP中文网