1

十六进制数的字符串如:0X1.05P+10

这个十六进制数的真实值为:1044.0

我可以使用带有 strtod 方法的 C 语言对其进行转换。但我找不到在 PHP 中转换它的方法。有人可以告诉我怎么做吗?

值字符串列表:

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

2 回答 2

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));
};
于 2013-05-21T13:12:16.007 回答
0

hexdec(0X1.05P+10)

好的,所以这对我来说看起来不对,因为它看起来不像是一个正确的十六进制数,而是你在 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) 10 = (414) 16

于 2013-05-21T12:16:01.120 回答