【问题标题】:Convert 64 bit hexadecimal to float in PHP在 PHP 中将 64 位十六进制转换为浮点数
【发布时间】:2016-03-08 03:18:58
【问题描述】:

我正在尝试将 64 位十六进制数转换为 PHP 中的浮点数。

40F82C719999999A

如果我在http://babbage.cs.qc.cuny.edu/IEEE-754.old/64bit.html 的 IEEE-754 浮点转换页面中运行它,它会转换为:

99015.100000000000

这是我要找的号码。但我无法在 PHP 中得到这个数字。我尝试过使用 pack() 和 unpack() 的各种组合,但我离得很近。 :(

【问题讨论】:

  • 您是否要获得floatdouble 表示?换句话说,您运行的是 32 位或 64 位版本的 PHP 吗?
  • 你能提供你正在使用的代码吗?
  • @flosculus 如果 PHP_INT_SIZE 是可信的,我正在运行 64 位 PHP。
  • @James 代码我试过了:$binarydata64 = pack('H*','40F82C719999999A'); $float64 = unpack("d", $binarydata64);

标签: php hex ieee-754


【解决方案1】:
function hex2float($strHex) {
    $hex = sscanf($strHex, "%02x%02x%02x%02x%02x%02x%02x%02x");
    $hex = array_reverse($hex);
    $bin = implode('', array_map('chr', $hex));
    $array = unpack("dnum", $bin);
    return $array['num'];
}

$float = hex2float('40F82C719999999A');
echo $float;

将返回 99015.1

【讨论】:

  • 4019999a 应该给2.4 但它给6.4000015258789
【解决方案2】:

如何将浮点数转换为 64 位十六进制:

function float2hex($num) {
    $bin = pack("d", $num);
    $hex = array_map('ord', str_split($bin));
    $hex = array_reverse($hex);
    $strHex = vsprintf("%02x%02x%02x%02x%02x%02x%02x%02x", $hex);
    return $strHex;
}
$hex = float2hex(99015.100000000000);
echo strtoupper($hex);

将返回 40F82C719999999A

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 2020-07-28
    • 2011-03-05
    • 2010-12-08
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多