【问题标题】:Interpret 16bit two's complement in javascript (nodejs)在 javascript (nodejs) 中解释 16 位二进制补码
【发布时间】:2017-06-18 20:55:02
【问题描述】:

亲爱的群体智能,你好,

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

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

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

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

【问题讨论】:

  • 亲爱的群体智能你好, +1 ;)。 js中没有二进制类型。它可以是数字(16 位浮点值或 int)或字符串。
  • 您好,谢谢您的回答。有趣的是,js 中有位运算符,所以我想也许还有一种方法可以解释 16 位有符号类型。我希望有一些 perl 式的打包/解包魔法
  • 我已经有一段时间没有玩过二进制补码了,但我想看看这里 (stackoverflow.com/questions/9939760/…) 和这里 (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)。我认为这会让你朝着正确的方向前进......
  • 我觉得这里已经有解决方案了stackoverflow.com/questions/27911677/…
  • Javascript 支持对不大于 4 字节的整数进行按位运算。但是,在处理大数时,知道 Javascript 的 Number 类型实际上是 IEEE754(双精度)会很有帮助。这为您提供了 52 位可用于整数,您可以使用 Math(主要是 pow)来帮助您模拟按位运算。

标签: javascript node.js signed twos-complement 16-bit


【解决方案1】:
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 位整数,但具有正确的值。

【讨论】:

  • 你就是那个男人。显而易见的方法不知何故被忽视了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
相关资源
最近更新 更多