2013-05-21 66 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