如何在JavaScript中将1个4位整数与2个10位整数打包进Uint8Array(3)并回读
解决4位+10位+10位整数打包到Uint8Array的位操作错误
问题出在中间10位整数b的位分配和读写逻辑上,以下是错误分析和修正方案:
错误原因
- 写入时的位偏移错误:
- 原代码用
b >> 4获取b的高4位,但b是10位整数,高4位需要右移6位(b >> 6)才能得到,右移4位会多包含2位低阶位。 - 写入字节1时,原代码用
b << 6,这会丢弃b的高4位且位位置错误,正确应该取b的低6位(b & 0x3f)后左移2位,填充到字节1的高6位。
- 原代码用
- 读取时的位提取错误:
- 原代码读取
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
相关产品推荐
相关产品推荐

