本文實例講述了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
classjinzhi_class
{
//10進制轉2、8、16、36、62進制
functionjinzhih_0($shu,$jinzhi,$w)
{
$zifu="";
while($shu!=0){
$linshi=$shu%$jinzhi;
switch($jinzhi){
case2:
$zifu=decbin($shu);
return$zifu;
case8:
$zifu=decoct($shu);
return$zifu;
case16:
$zifu=dechex($shu);
return$zifu;
case36:
if($linshi>=10)
{
$zifu.=chr(($linshi+55));
}else{
$zifu.=$linshi;}
break;
case62:
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";
returnstrrev($zifu);}
//2、8、16、36、62進制轉10進制
functionjinzhih_1($zifu,$jinzhi,$w)
{$shu=0;
for($i=0;$i=strlen($zifu)-1;$i++)
{
$linshi=substr($zifu,$i,1);
switch($jinzhi){
case2:
$shu=bindec($zifu);
$i=strlen($zifu)+1;
break;
case8:
$shu= octdec($zifu);
$i=strlen($zifu)+1;
break;
case16:
$shu= hexdec($zifu);
$i=strlen($zifu)+1;
break;
case36:
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;
case62:
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進制
functionjinzhih_G0($shu,$jinzhi,$w)
{
$zifu="";
while($shu!=0){
$linshi=bcmod($shu,$jinzhi);
switch($jinzhi){
case2:
$zifu=decbin($shu);
return$zifu;
case8:
$zifu=decoct($shu);
return$zifu;
case16:
$zifu=dechex($shu);
return$zifu;
case36:
if($linshi>=10)
{
$zifu.=chr(($linshi+55));
}else{
$zifu.=$linshi;}
break;
case62:
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";
returnstrrev($zifu);}
//2、8、16、36、62進制高精度轉換10進制
functionjinzhih_G1($zifu,$jinzhi,$w)
{$shu="";
for($i=0;$i=strlen($zifu)-1;$i++)
{
$linshi=substr($zifu,$i,1);
switch($jinzhi){
case2:
$shu=bindec($zifu);
$i=strlen($zifu)+1;
break;
case8:
$shu= octdec($zifu);
$i=strlen($zifu)+1;
break;
case16:
$shu= hexdec($zifu);
$i=strlen($zifu)+1;
break;
case36:
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;
case62:
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=newjinzhi_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);
?>