如何在JavaScript中将四个10位整数编码进Uint8Array(5)并还原?
解决10位整数的Uint8Array打包与还原问题
4个取值0-1023的整数(每个占10位),总长度刚好是40位,对应5个字节(5×8=40),你的代码核心问题是位运算的分配和提取逻辑错误,以下是修正后的实现:
function writeInt10(arr, off, a, b, c, d) { // 确保输入值在0-1023范围内 a = a & 0x3FF; b = b & 0x3FF; c = c & 0x3FF; d = d & 0x3FF; // 字节0:a的低8位 arr[off] = a & 0xFF; // 字节1:a的高2位(占前2位) + b的低6位(占后6位) arr[off+1] = ((a >> 8) & 0x3) | ((b << 2) & 0xFC); // 字节2:b的高4位(占前4位) + c的低4位(占后4位) arr[off+2] = ((b >> 6) & 0xF) | ((c << 4) & 0xF0); // 字节3:c的高6位(占前6位) + d的低2位(占后2位) arr[off+3] = ((c >> 4) & 0x3F) | ((d << 6) & 0xC0); // 字节4:d的高8位 arr[off+4] = (d >> 2) & 0xFF; } function readInt10(arr, off) { // 提取a:字节0的8位 + 字节1的高2位左移8位 const a = arr[off] | ((arr[off+1] >> 6) & 0x3) << 8; // 提取b:字节1的低6位左移4位 + 字节2的高4位 const b = ((arr[off+1] & 0xFC) >> 2) | ((arr[off+2] >> 4) & 0xF) << 6; // 提取c:字节2的低4位左移6位 + 字节3的高6位 const c = ((arr[off+2] & 0xF0) >> 4) | ((arr[off+3] >> 2) & 0x3F) << 4; // 提取d:字节3的低2位左移8位 + 字节4的8位 const d = ((arr[off+3] & 0xC0) >> 6) | arr[off+4] << 2; return [a, b, c, d]; } // 测试代码 const buf = new Uint8Array(5); writeInt10(buf, 0, 1023, 100, 512, 768); const read = readInt10(buf, 0); console.log(read); // 输出 [1023, 100, 512, 768]
关键逻辑说明
每个10位整数的位分配如下(从高位到低位):
- a(10位):字节0的第0-7位,字节1的第6-7位
- b(10位):字节1的第0-5位,字节2的第4-7位
- c(10位):字节2的第0-3位,字节3的第2-7位
- d(10位):字节3的第0-1位,字节4的第0-7位
写函数通过位运算将每个数的对应部分拆分到对应字节;读函数则反向将字节中的对应位拼接回完整的10位整数,同时用&操作确保不会超出10位范围(0x3FF是10位全1的十六进制值)。
内容的提问来源于stack exchange,提问作者Unwarped
相关产品推荐
相关产品推荐

