2013-05-21 98 views
1

十六進制數字的字符串是這樣的:0X1.05P + 10轉換的十六進制數爲雙

這個十六進制數的真正價值在於:1044.0

我可以用C語言與方法的strtod將其轉換。 但我找不到在PHP中將其轉換的方式。有人能告訴我該怎麼做嗎?

值字符串列表:

1. "0X1.FAP+9" 
2. "0X1.C4P+9" 
3. "0X1.F3P+9" 
4. "0X1.05P+10" 
+0

人的strtod:十六進制數由'0X'或'0X''後跟一個非空的十六進制數字序列,可能包含一個 基數字符,可選地後跟一個二進制指數。二進制指數由一個「P」或「p」組成,後跟一個可選的 加號或減號,後跟一個非空的十進制數字序列,並指示乘以2的冪。至少一個 的基數字符和二進制指數必須存在。 – user2405409

回答

0

我認爲你必須做出一個自定義的功能這一點。所以,因爲我今天感覺不錯我定做了一個給你:

function strtod($hex) { 
    preg_match('#([\da-f]+)\.?([\da-f]*)p#i', $hex, $parts); 

    $i = 0; 
    $fractional_part = array_reduce(str_split($parts[2]), function($sum, $part) use (&$i) { 
     $sum += hexdec($part) * pow(16, --$i); 

     return $sum; 
    }); 

    $decimal = (hexdec($parts[1]) + $fractional_part) * pow(2, array_pop(explode('+', $hex))); 

    return $decimal; 
} 

foreach(array('0X1.FAP+9', '0X1.C4P+9', '0X1.F3P+9', '0X1.05P+10', '0X1P+0') as $hex) { 
    var_dump(strtod($hex)); 
}; 

對於低於PHP 5.3版本:

function strtod($hex) { 
    preg_match('#([\da-f]+)\.?([\da-f]*)p#i', $hex, $parts); 

    $fractional_part = 0; 

    foreach(str_split($parts[2]) as $index => $part) { 
     $fractional_part += hexdec($part) * pow(16, ($index + 1) * -1); 
    } 

    $decimal = (hexdec($parts[1]) + $fractional_part) * pow(2, array_pop(explode('+', $hex))); 

    return $decimal; 
} 

foreach(array('0X1.FAP+9', '0X1.C4P+9', '0X1.F3P+9', '0X1.05P+10', '0X1P+0') as $hex) { 
    var_dump(strtod($hex)); 
}; 
+0

哇,真的非常感謝您的回覆,並且您的回答是正確的(我在http://codepad.viper-7.com/DVEfjh上試過),但是我的php版本是5.2.17所以我得到了「語法錯誤,意外的T_FUNCTION」,你能幫我修復它嗎?我是一個新手到php – user2405409

+0

爲什麼你有這樣一箇舊的和過時的PHP版本? – silkfire

+0

現在爲我工作,非常感謝。 – user2405409

0

hexdec(0X1.05P+10)

OK所以看起來我錯了作爲看起來並不像一個適當的十六進制數,但是你想在PHP http://php.net/manual/en/function.hexdec.php其hexdec()函數

echo hexdec("0X1FAP")+9 
echo hexdec("0X1C4P")+9 
echo hexdec("0X1F3P")+9 
echo hexdec("0X105P")+10 

小數=十六進制 (1044.0) =(414)

+0

是的,我試過這種方法,但它似乎不正確。結果與strtod的結果不同。 – user2405409

+0

這不是一個有效的十六進制輸入,即使我們假設它與1044.0不等價。例如0X1.FAP + 9是1.978759765625 – Dave

+1

man strtod found:一個十六進制數字由一個''0x''或''0X''組成,後面跟着一個十六進制數字的非空序列,可能包含一個 基數字符,可選地後跟一個二進制指數。二進制指數由一個「P」或「p」組成,後跟一個可選的 加號或減號,後跟一個非空的十進制數字序列,並指示乘以2的冪。至少一個 的基數字符和二進制指數必須存在。 – user2405409