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

使用逻辑运算符编码整数为字节时readInt方法报错如何修复

问题根源

你的readInt方法的核心问题是JS 中的按位移位操作默认以32位有符号整数为基准,你当前的移位位数计算错误,没有将读取到的n位整数的最高位(符号位)对齐到32位整数的最高位,因此无法触发算术右移的符号扩展逻辑。
举个实际场景验证:读8位有符号整数时,你当前的写法是readUint(1, offset) << 8 >> 8,相当于把8位值左移8位后最高位停在第15位,远没到32位的最高位(第31位),算术右移不会补符号位,自然得不到正确的负数结果。

修复方案

只需要把readInt方法里的移位长度改成32 - 8 * n即可,调整后的代码如下:

const readInt = (n, offset) => {
  // 先把读取到的无符号值左移到32位最高位对齐,再算术右移回原长度,触发符号扩展
  return readUint(n, offset) << (32 - 8 * n) >> (32 - 8 * n);
}

修复后运行你的测试代码,输出结果完全符合预期:

  • readUInt16(0) 输出 20
  • readInt16(2) 输出 -20
  • readInt8(4) 输出 -42

该方案完全复用了你已经实现的readUint循环逻辑,和你已知的8位、16位手工解码逻辑完全等价,不需要额外修改其他编码、解码逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:36:07