使用逻辑运算符编码整数为字节时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)输出20readInt16(2)输出-20readInt8(4)输出-42
该方案完全复用了你已经实现的readUint循环逻辑,和你已知的8位、16位手工解码逻辑完全等价,不需要额外修改其他编码、解码逻辑。
内容的提问来源于stack exchange,提问作者stacj
相关产品推荐
相关产品推荐

