2017-04-20 140 views
0

我必須用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

回答

0

這裏是「經典」算法爲你考慮,檢查意見:

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

感謝您的幫助,你節省了我的一天 –

相關問題