如何将JavaScript中的一个字节(8位)转换为有符号整数?

How to convert one byte (8 bit) to signed integer in JavaScript?

我需要将一个字节转换成 java 脚本有符号整数。我已经检查了 this link 转换 2 个字节,但是我怎么能降级并只转换一个字节呢?

例如 0x0A 就是 10,那么 0xD4 呢?

我想到了这个解决方案:

function convertToSignedInt(signedByte) {
    var sign = signedByte & (1 << 7);
    return (signedByte & 0x7f) * (sign !== 0 ? -1 : 1);
}

希望它能为其他人节省一些时间。 convertToSignedInt(0x81) // returns -1

此解决方案对负数使用 2 的补码进行转换,这是对负数进行编码的标准方式。

function uncomplement(val, bitwidth) {
    var isnegative = val & (1 << (bitwidth - 1));
    var boundary = (1 << bitwidth);
    var minval = -boundary;
    var mask = boundary - 1;
    return isnegative ? minval + (val & mask) : val;
}

反补(0xFF, 8) returns -1
反补(0x80, 8) returns -128
未补码(0x7F,8)returns 127

Javascript 将按位运算符作为带符号的 32 位整数处理。

知道这一点,如果你想对一个字节进行符号扩展,你需要将字节的最高位(表示符号)传播到三十二位整数中的所有高位。这可以通过以下方式实现:

value << 24 >> 24

这样做是将字节移动到 32 位整数的顶部,然后将其向下移动保留符号位

同样,您可以使用以下符号扩展 16 位值:

value << 16 >> 16