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

如何在JavaScript中将1个4位整数与2个10位整数打包进Uint8Array(3)并回读

解决4位+10位+10位整数打包到Uint8Array的位操作错误

问题出在中间10位整数b的位分配和读写逻辑上,以下是错误分析和修正方案:

错误原因

  1. 写入时的位偏移错误:
    • 原代码用b >> 4获取b的高4位,但b是10位整数,高4位需要右移6位(b >> 6)才能得到,右移4位会多包含2位低阶位。
    • 写入字节1时,原代码用b << 6,这会丢弃b的高4位且位位置错误,正确应该取b的低6位(b & 0x3f)后左移2位,填充到字节1的高6位。
  2. 读取时的位提取错误:
    • 原代码读取b的低6位时用(arr[off + 1] & 0xfc) >> 4,这只提取了字节1的前4位,正确应该提取字节1的前6位((arr[off+1] >> 2) & 0x3f)。

修正后的代码

function writeInt4_10_10(arr, off, a, b, c) {
  // 字节0:a的4位(高4) + b的高4位(低4)
  arr[off] = (a << 4) | ((b >> 6) & 0x0f);
  // 字节1:b的低6位(高6) + c的高2位(低2)
  arr[off + 1] = ((b & 0x3f) << 2) | ((c >> 8) & 0x03);
  // 字节2:c的低8位
  arr[off + 2] = c & 0xff;
}

function readInt4_10_10(arr, off) {
  const a = (arr[off] >> 4) & 0x0f;
  // 拼接b的高4位(来自字节0低4位)和低6位(来自字节1高6位)
  const b = ((arr[off] & 0x0f) << 6) | ((arr[off + 1] >> 2) & 0x3f);
  // 拼接c的高2位(来自字节1低2位)和低8位(来自字节2)
  const c = ((arr[off + 1] & 0x03) << 8) | (arr[off + 2] & 0xff);
  return [a, b, c];
}

// 测试
var buf = new Uint8Array(3);
writeInt4_10_10(buf, 0, 13, 1001, 999);
var r = readInt4_10_10(buf, 0);
console.log(r); // 输出 [13, 1001, 999]

位分配说明

3字节共24位,刚好匹配4+10+10的位需求,具体分配如下:

  • 字节0:[a3,a2,a1,a0, b9,b8,b7,b6]
  • 字节1:[b5,b4,b3,b2,b1,b0, c9,c8]
  • 字节2:[c7,c6,c5,c4,c3,c2,c1,c0]

内容的提问来源于stack exchange,提问作者Unwarped

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:07:01