【问题标题】:Convert hexadecimal number to double将十六进制数转换为双精度
【发布时间】:2013-05-21 12:14:09
【问题描述】:

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

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

我可以使用 C 语言和 strtod 方法对其进行转换。 但我找不到在 PHP 中转换它的方法。谁能教我怎么做?

值字符串列表:

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

【问题讨论】:

  • man strtod : 一个十六进制数由一个 ''0x'' 或 ''0X'' 后跟一个非空的十六进制数字序列组成,可能包含一个基数字符,可选地后跟一个二进制指数。二进制指数由一个“P”或“p”组成,后跟一个可选的加号或减号,后跟一个非空的十进制数字序列,并表示乘以 2 的幂。至少一个必须存在基数字符和二进制指数。

标签: php hex


【解决方案1】:

我认为您必须为此创建一个自定义函数。所以因为我今天感觉很好,所以我为你定制了一个:

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));
};

【讨论】:

  • 哇,真的很感谢你的回复,而且你的回答是对的(我在codepad.viper-7.com/DVEfjh上试过)但是我的php版本是5.2.17所以我得到“语法错误,意外的T_FUNCTION”,你能帮我修一下吗?我是 php 的新手
  • 为什么会有这么老旧的PHP版本?
  • 您的代码中存在错误。 0X1P+0 值为 1,但使用你的代码,我得到 0
  • 是的,我假设所有数字都是十进制的(需要一个'.')。调整了代码中的正则表达式。
  • oo.. 我遇到了一个新问题。 0X1.95810624DD2F2P-4 是 0.099000 但使用你的解决方案,我得到了 3.168。你能帮我再解决一次吗?
【解决方案2】:

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

【讨论】:

  • 是的,我尝试过这种方法,但它似乎无法正常工作。结果与strtod的结果不同。
  • 这不是一个有效的十六进制输入,即使我们假设它不等于 1044.0。 0X1.FAP+9 例如是 1.978759765625
  • man strtod found: 一个十六进制数由一个 ''0x'' 或 ''0X'' 后跟一个可能包含基数字符的非空十六进制数字序列组成,可选地后跟一个二进制指数。二进制指数由一个“P”或“p”组成,后跟一个可选的加号或减号,后跟一个非空的十进制数字序列,并表示乘以 2 的幂。至少一个必须存在基数字符和二进制指数。
  • 那是 strtod 特有的,然后我假设它不是标准格式, 0x1 = 1 是但完整的结构不是。简单的测试继续谷歌找到一个十六进制到十进制转换器或十进制到十六进制并放入你的 1044.0 和你的字符串,看看他们输出什么。
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 2014-05-05
  • 2011-04-03
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多