【问题标题】:Extract number form a hexadecimal dataFrame parseInt()ParseFloat()从十六进制数据帧中提取数字 parseInt()ParseFloat()
【发布时间】:2021-04-12 09:08:46
【问题描述】:

我正在尝试解析来自某些传感器的数据,我收到的数据是十六进制数字 f.e.: '450934644ad7a38441' 我想提取最后 8 个字符,即温度值,并将其转换为可读数字。 我试过这个网站:https://www.scadacore.com/tools/programming-calculators/online-hex-converter/

在这里,当您输入 d7a38441 时,它会被处理并且想要的数字在 Float - Little Endian (DCBA) 系统下。 它所做的转换也是在 UINT32 - Big Endian (ABCD) 系统下进行的

如何将此数字转换为浮点数?我尝试在这里阅读其他一些问题,但找不到解决方案。 parseFloat() 给我 NaN。

我会很感激。

var data = '450934644ad7a38441';

function main(data) {

  var result = [
    {      
        "key": "temperature",
        "value": parseInt('0x'+data.substring(10))
    }
    ]
  
  
  return result;
}

console.log(main(data));
// expected output: Array [Object { key: "temperature", value: 16.58 }]

【问题讨论】:

  • 感谢 cmets,我已经尝试调整此解决方案,但无法使其正常工作。我是 javaScript 新手,所以我很难为我的问题找到合适的答案
  • @MohamedRady 是的,我试过了,使用 parseInt(data.substring(10),16) 类似于: parseInt('0x'+data.substring(10))
  • 附带说明,如果您想要最后 8 个字符data.substr(-8) 在语义上可能会更好。

标签: javascript json


【解决方案1】:

我认为this is 你需要什么。函数yourStringToFloat 接收的字符串是您的示例中主函数接收的data 变量。当然你可以根据自己的需要来修正精度。

function flipHexString(hexValue, hexDigits) {
  var h = hexValue.substr(0, 2);
  for (var i = 0; i < hexDigits; ++i) {
    h += hexValue.substr(2 + (hexDigits - 1 - i) * 2, 2);
  }
  return h;
}


function hexToFloat(hex) {
  var s = hex >> 31 ? -1 : 1;
  var e = (hex >> 23) & 0xFF;
  return s * (hex & 0x7fffff | 0x800000) * 1.0 / Math.pow(2, 23) * Math.pow(2, (e - 127))
}

function yourStringToFloat(str){

    return hexToFloat(flipHexString("0x"+str.substr(10), 8))

}

console.log(yourStringToFloat('450934644ad7a38441'));

【讨论】:

  • 感谢卡罗尔的回复,非常感谢!这对我帮助很大
猜你喜欢
  • 2014-02-18
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2022-01-02
  • 2018-07-27
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多