如何将十六进制字节串转为小端格式Uint16数组并修复现有JS代码
十六进制字符串转小端16位数值数组实现
原代码问题分析
- 未将十六进制字符转换为对应数值,直接使用字符的ASCII码参与位运算,导致结果偏差
- 循环步长设置错误,没有按2个字符对应1字节、4个字符对应1个Uint16的规则迭代,出现越界赋值和重复赋值问题
- 位运算逻辑不符合小端字节序的拼接规则,无法得到正确的16位数值
正确实现代码
// 十六进制字符转对应数值 function hexCharToValue(char) { const code = char.charCodeAt(0); if (code >= 48 && code <= 57) return code - 48; // 0-9 if (code >= 65 && code <= 70) return code - 55; // A-F if (code >= 97 && code <= 102) return code - 87; // a-f throw new Error(`无效的十六进制字符: ${char}`); } function hexStrToLittleEndianUint16Array(hexStr) { // 预处理:去除所有非十六进制字符 let cleanStr = hexStr.replace(/[^0-9a-fA-F]/g, ''); // 长度为奇数时补0对齐字节边界,可根据业务需求选择补前导0或者末尾0 if (cleanStr.length % 2 !== 0) { cleanStr = '0' + cleanStr; } // 1个Uint16对应4个十六进制字符 const uint16Count = Math.floor(cleanStr.length / 4); const result = new Uint16Array(uint16Count); for (let i = 0; i < uint16Count; i++) { // 小端规则:低字节在前,高字节在后 const lowByte = (hexCharToValue(cleanStr[i*4]) << 4) | hexCharToValue(cleanStr[i*4 +1]); const highByte = (hexCharToValue(cleanStr[i*4 +2]) <<4) | hexCharToValue(cleanStr[i*4 +3]); result[i] = (highByte << 8) | lowByte; } return result; } // 测试示例 const inputStr = "0C001A0001000800030000010501000000800100001003103F002A0"; const res = hexStrToLittleEndianUint16Array(inputStr); // 格式化为0xXXXX形式查看结果 console.log(Array.from(res).map(val => '0x' + val.toString(16).padStart(4, '0')));
测试输出前几项为0x000c、0x001a、0x0001、0x0008,完全符合需求。
内容的提问来源于stack exchange,提问作者Saumya Tyagi
相关产品推荐
相关产品推荐

