将十六进制字符串转换为浮点型

时间:2019-02-06 14:13:10

标签: php hex

嗨,我需要将此十六进制字符串6BE15C3E转换为浮点数。我过去一直在使用Arduino来执行此操作,下面是将HEX转换为Arduino上的float的代码。

uint8_t l[] = {0x6b, 0xe1, 0x5c, 0x3e};
float var1;
memcpy(&var1, l, 4);
Serial.println(var1);

上面的代码结果为0.22是正确的。我尝试在PHP中使用以下代码,但没有得到正确的答案:

print_r(hex2float("6BE15C3E"));
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'];
}

这段代码正在返回4.56588239954E+211,这似乎还很遥远,我不确定为什么。我知道Arduino示例已经事先转换为字节,但是我不知道是否需要在PHP中完成。

2 个答案:

答案 0 :(得分:0)

感谢Nigel Ren解决此问题。这是用于解决此问题的代码:

function hex2float($strHex) {
    $hex = sscanf($strHex, "%02x%02x%02x%02x%02x%02x%02x%02x");
    $bin = implode('', array_map('chr', $hex));
    $array = unpack("f", $bin);
    return $array[1];
}

输入6BE15C3E时将返回0.215...,这是四舍五入后的正确答案。

答案 1 :(得分:0)

这些可能不是最佳选择,但我认为它们可以工作:

function hex2float($strHex) {
    $hex = sscanf($strHex, "%02x%02x%02x%02x");
    $hex = array_reverse($hex);
    $bin = implode('', array_map('chr', $hex));
    $array = unpack("f", $bin);
    return $array[1];
}

function float2hex($f)
{
    $a = unpack("I", pack( "f", $f ));
    $w = pack("N", $a[1] );
    return bin2hex($w);
}

测试:

function Test($hex)
{
    $f = hex2float($hex);
    $hex2 = float2hex($f);
    echo "$hex --> $f --> $hex2<br>\n";
}


3f800000 --> 1 --> 3f800000
40000000 --> 2 --> 40000000
bf800000 --> -1 --> bf800000
c0000000 --> -2 --> c0000000
6BE15C3E --> 5.448878216557E+26 --> 6be15c3e
3E5CE16B --> 0.21570365130901 --> 3e5ce16b

假设您的Arduino和PHP脚本在不同的“ endian”机器上运行,则应从array_reverse()中删除hex2float以“修复”该功能。 (并且float2hex将需要某种反向才能使其匹配。)

我还没有考虑过实现DOUBLE和十六进制之间的转换所需要的时间。