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

如何将十六进制字节串转为小端格式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:36:04