如何将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
我需要将一个字节转换成 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