十六進制數字的字符串是這樣的:0X1.05P + 10轉換的十六進制數爲雙
這個十六進制數的真正價值在於:1044.0
我可以用C語言與方法的strtod將其轉換。 但我找不到在PHP中將其轉換的方式。有人能告訴我該怎麼做嗎?
值字符串列表:
1. "0X1.FAP+9"
2. "0X1.C4P+9"
3. "0X1.F3P+9"
4. "0X1.05P+10"
十六進制數字的字符串是這樣的:0X1.05P + 10轉換的十六進制數爲雙
這個十六進制數的真正價值在於:1044.0
我可以用C語言與方法的strtod將其轉換。 但我找不到在PHP中將其轉換的方式。有人能告訴我該怎麼做嗎?
值字符串列表:
1. "0X1.FAP+9"
2. "0X1.C4P+9"
3. "0X1.F3P+9"
4. "0X1.05P+10"
我認爲你必須做出一個自定義的功能這一點。所以,因爲我今天感覺不錯我定做了一個給你:
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));
};
哇,真的非常感謝您的回覆,並且您的回答是正確的(我在http://codepad.viper-7.com/DVEfjh上試過),但是我的php版本是5.2.17所以我得到了「語法錯誤,意外的T_FUNCTION」,你能幫我修復它嗎?我是一個新手到php – user2405409
爲什麼你有這樣一箇舊的和過時的PHP版本? – silkfire
現在爲我工作,非常感謝。 – user2405409
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)
是的,我試過這種方法,但它似乎不正確。結果與strtod的結果不同。 – user2405409
這不是一個有效的十六進制輸入,即使我們假設它與1044.0不等價。例如0X1.FAP + 9是1.978759765625 – Dave
man strtod found:一個十六進制數字由一個''0x''或''0X''組成,後面跟着一個十六進制數字的非空序列,可能包含一個 基數字符,可選地後跟一個二進制指數。二進制指數由一個「P」或「p」組成,後跟一個可選的 加號或減號,後跟一個非空的十進制數字序列,並指示乘以2的冪。至少一個 的基數字符和二進制指數必須存在。 – user2405409
人的strtod:十六進制數由'0X'或'0X''後跟一個非空的十六進制數字序列,可能包含一個 基數字符,可選地後跟一個二進制指數。二進制指數由一個「P」或「p」組成,後跟一個可選的 加號或減號,後跟一個非空的十進制數字序列,並指示乘以2的冪。至少一個 的基數字符和二進制指數必須存在。 – user2405409