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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:23:10