解释 javascript 中的 16 位二进制补码 (nodejs)

Interpret 16bit two's complement in javascript (nodejs)

你好亲爱的群体智能,

我目前的一个私人项目是在物联网领域,特别是 LoRaWan 和 TTN。为了便于数据处理,我决定使用 node-red,这是一个基于 node-js 的流工具来处理接收到的数据。 这是我第一次接触到 javascript 世界(除了小阅读 ;))。问题是:

我正在传输一个 C-Style int16_t 签名类型,通过 ttn 分为两个 8 位半字节。在接收站点上,我想再次将这两个半字节合并为一个带符号的 16 位类型。那么问题是 javascript 只支持 32 位整数,这意味着通过像这样的按位操作简单地合并它们:

newMsg.payload=(msg.payload[1]<<8)|(msg.payload[0]);

我丢失了带符号的信息,只得到数据的无符号解释,因为它不是存储在 32 位二进制补码中。 由于我还不太熟悉 javascript "standard library" 这对我来说似乎是个难题! 任何帮助将不胜感激

var unsignedValue = (msg.payload[1] << 8) | (msg.payload[0]);

if (result & 0x8000) {
    // If the sign bit is set, then set the two first bytes in the result to 0xff.
    newMsg.payload = unsignedValue | 0xffff0000;
} else {
    // If the sign bit is not set, then the result  is the same as the unsigned value.
    newMsg.payload = unsignedValue;
}

请注意,这仍然将该值存储为带符号的 32 位整数,但具有正确的值。