JavaScript函数问题:十六进制字符串提取温度值返回错误结果
问题分析与代码修正
原代码的核心问题
- 空字符串干扰:输入字符串结尾带
.,调用split('.')后会生成末尾空字符串。例如输入"03.00.20.80.0F.00.00.68.98.01."拆分后,数组最后一位是空字符串,导致slice(-2)取到['01', ''],拼接后仅为'01',后续计算完全偏离预期。 - 字节顺序错误:需求要求将最后两个字节(
98.01)拼接为高字节在前的0198,但原代码直接按原顺序拼接,不符合传感器的字节存储逻辑。 - 数值拆分逻辑错误:原代码仅简单截取高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ř
相关产品推荐
相关产品推荐

