十六进制数字的字符串是这样的: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