php实现的任意进制互转类分享
之前不知道php自带有base_convert可以实现任意进制之间的转换,自己写了一个。。。。
<?php
/**
*进制转换类
*@authorsgf@funcity
*@version2011-02-15
*/
ClassHex{
privatestatic$element=array(
'0','1','2','3','4','5','6','7','8','9',
'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'
);
privatestatic$hex_min=2;
privatestatic$hex_max=36;
/**
*进制转换
*/
publicfunctionconv($int,$out_hex,$in_hex=10,$use_system=true){
if($use_system&&function_exists('base_convert')){
returnstrtoupper(base_convert($int,$in_hex,$out_hex));
}
if($out_hex==$in_hex){
return$int;
}
if($out_hex>self::$hex_max||$out_hex<self::$hex_min){
returnfalse;
}
if($in_hex>self::$hex_max||$in_hex<self::$hex_min){
returnfalse;
}
$hex_10=$this->_conv2hex10($int,$in_hex);
returnstrtoupper($this->_conv_hex($hex_10,$out_hex));
}
/**
*将任意进制数字转为10进制数字
*/
privatefunction_conv2hex10($int,$in_hex){
$int=strtoupper(trim($int));
if($in_hex==10){
return$int;
}elseif($in_hex==2&&function_exists('bindec')){
returnbindec($int);
}elseif($in_hex==16&&function_exists('hexdec')){
returnhexdec($int);
}elseif($in_hex==8&&function_exists('octdec')){
returnoctdec($int);
}
$array=array();
$result=0;
for($i=0;$i<strlen($int);$i++){
array_unshift($array,substr($int,$i,1));//插入到数组头部(既倒序)
}
foreach($arrayas$k=>$v){
$hex10_value=array_search($v,self::$element);
if($hex10_value==-1){
returnfalse;
}
$result+=intval(pow($in_hex,$k)*$hex10_value);
}
return$result;
}
/**
*把10进制数换成任意进制数
*/
privatefunction_conv_hex($hex_10,$out_hex){
$hex_10=intval($hex_10);
if($out_hex==10){
return$hex_10;
}elseif($out_hex==2&&function_exists('decbin')){
returndecbin($hex_10);
}elseif($out_hex==16&&function_exists('dechex')){
returndechex($hex_10);
}elseif($out_hex==8&&function_exists('decoct')){
returndecoct($hex_10);
}
$array=array();
$result="";
//利用10进制数除任意进制数倒取余数法转换。
do{
array_unshift($array,$hex_10%$out_hex);//余数插入到数组数组第1个位置。
$hex_10=$hex_10/$out_hex;//除法
}while($hex_10>1);
foreach($arrayas$k){
$result.=self::$element[$k];
}
return$result;
}
}
?>