You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript函数问题:十六进制字符串提取温度值返回错误结果

问题分析与代码修正

原代码的核心问题

  1. 空字符串干扰:输入字符串结尾带.,调用split('.')后会生成末尾空字符串。例如输入"03.00.20.80.0F.00.00.68.98.01."拆分后,数组最后一位是空字符串,导致slice(-2)取到['01', ''],拼接后仅为'01',后续计算完全偏离预期。
  2. 字节顺序错误:需求要求将最后两个字节(98.01)拼接为高字节在前的0198,但原代码直接按原顺序拼接,不符合传感器的字节存储逻辑。
  3. 数值拆分逻辑错误:原代码仅简单截取高8位和低8位,未按照需求将低8位拆分为高4位(整数部分补充)和低4位(小数部分)。

修正后的代码

function splitAndConvertHex(hexString) {
  // 拆分字符串并过滤空元素,处理结尾的点带来的干扰
  const bytes = hexString.split('.').filter(byte => byte.trim() !== '');
  // 获取最后两个有效字节,传感器返回的是低字节在前、高字节在后
  const [lowByte, highByte] = bytes.slice(-2);
  // 拼接成高字节在前的十六进制数:01 + 98 = 0198
  const combinedHex = highByte + lowByte;
  const combinedValue = parseInt(combinedHex, 16);
  
  // 提取高8位和低8位
  const high8Bits = (combinedValue >> 8) & 0xFF;
  const low8Bits = combinedValue & 0xFF;
  
  // 整数部分:高8位*16 + 低8位的高4位
  const wholeNumber = high8Bits * 16 + (low8Bits >> 4);
  // 小数部分:低8位的低4位除以10
  const decimalNumber = (low8Bits & 0x0F) / 10;
  
  return [wholeNumber, decimalNumber];
}

const hexString = "03.00.20.80.0F.00.00.68.98.01.";
const [whole, decimal] = splitAndConvertHex(hexString);
const result = whole + decimal;
console.log("Výsledek: " + result); // 输出 25.8

关键修正说明

  • 过滤空元素:通过filter方法剔除拆分后产生的空字符串,确保取到的最后两个字节是有效数据'98'和'01'。
  • 修正字节顺序:将最后两个字节反转后拼接,得到需求要求的0198格式十六进制数。
  • 调整拆分逻辑:把低8位拆分为高4位和低4位,高8位乘16加上低8位的高4位得到整数部分(01*16 +9=25),低8位的低4位除以10得到小数部分(8/10=0.8),两者相加得到正确结果25.8。

内容的提问来源于stack exchange,提问作者Marek Prachař

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:30:15