将十六进制转换为十进制php

时间:2017-04-20 16:23:22

标签: php

我必须使用PHP将十六进制转换为十进制(不使用hexdec)作为我的作业,但我的代码无法正确转换。

例如,当我使用函数HexToDez ("1F4");时,答案应该是500,而不是1。

为什么不起作用?

代码

<?php    
function Replace ($i)
{
switch (strToLower ($i))
  {
  case "a" : return 10;
  case "b" : return 11;
  case "c" : return 12;
  case "d" : return 13;
  case "e" : return 14;
  case "f" : return 15;
  default  : return $i;
  }
}

function HexToDez($i) # 1F4
{
    $input=$i;
    $num=strlen ($input) ;
    $pos=0;
    $output="";
    $hochzahl="";
    while($pos<$num)
    {
        $mid = substr ($input, $pos, 1);
        $pos++;
        return $end=Replace ($mid);
    }   
    while ($end != 0){
        $zahl = $input%10;
        $output += $zahl*pow(16, $hochzahl);
        $end = $end/10;
        $hochzahl++;    
    }
    echo $output;
} 
?>

1 个答案:

答案 0 :(得分:0)

这里是&#34;经典&#34;算法供您考虑,查看评论:

function HexToDez($s) {
    $output = 0;
    for ($i=0; $i<strlen($s); $i++) {
        $c = $s[$i]; // you don't need substr to get 1 symbol from string
        if ( ($c >= '0') && ($c <= '9') )
            $output = $output*16 + ord($c) - ord('0'); // two things: 1. multiple by 16 2. convert digit character to integer
        elseif ( ($c >= 'A') && ($c <= 'F') ) // care about upper case
            $output = $output*16 + ord($s[$i]) - ord('A') + 10; // note that we're adding 10
        elseif ( ($c >= 'a') && ($c <= 'f') ) // care about lower case
            $output = $output*16 + ord($c) - ord('a') + 10;
    }

    return $output;
}

echo HexToDez("1F4"); // outputs 500

另外,您可以使用intval函数执行相同操作,只需将您的数字转换为十六进制表示,如0x###

function HexToDez($s) {
    return intval('0x'.$s, 16);
}