首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将十六进制字符串转换为浮点型

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

Stack Overflow用户
提问于 2019-02-06 22:13:10
回答 2查看 553关注 0票数 1

嗨,我需要将这个十六进制字符串6BE15C3E转换为一个浮点数。我过去一直使用Arduino来做这件事,下面是我会用来将十六进制转换为Arduino上的浮点数的代码。

代码语言:javascript
运行
复制
uint8_t l[] = {0x6b, 0xe1, 0x5c, 0x3e};
float var1;
memcpy(&var1, l, 4);
Serial.println(var1);

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

代码语言:javascript
运行
复制
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完成。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-06 23:08:07

感谢Nigel Ren修复此问题。以下是用于解决该问题的代码:

代码语言:javascript
运行
复制
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...,这是向上舍入时的正确答案。

票数 0
EN

Stack Overflow用户

发布于 2019-04-17 12:51:52

这些可能不是最优的,但我认为它们是有效的:

代码语言:javascript
运行
复制
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);
}

测试:

代码语言:javascript
运行
复制
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“机器上,那么应该从hex2float中删除array_reverse()以”修复“该函数。( float2hex需要某种反向操作才能使其匹配。)

我还没有仔细考虑过如何实现DOUBLE和十六进制之间的转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54555637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档