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

问题描述:

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

例如,当我使用功能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

你是什么意思“似乎没有w扫“?什么_exactly_是你的问题? – arkascha

+0

@arkascha当我使用函数HexToDez(“1F4”);答案应该是500而不是1 –

+1

那是因为你用'return $ end = Replace($ mid);'返回它。你可能想看看'return'的功能。 – Federkun

这里是“经典”算法为你考虑,检查意见:

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); 
} 
+0

所以我可以使用相同的算法为十六进制到八进制转换输出到八进制 –

+0

@MemoTesare是的,你是对的 –

+0

感谢您的帮助,你节省了我的一天 –