Интерпретировать 16-битное дополнение до двух в javascript (nodejs)

Здравствуй, дорогой роевой разум,

Один из моих текущих частных проектов связан с Интернетом вещей, в частности с LoRaWan и TTN. Для простоты обработки данных я решил использовать node-red, который представляет собой потоковый инструмент на основе node-js для обработки полученных данных. Это первый раз, когда я столкнулся с миром javascript (кроме незначительного чтения;)). Вот проблема:

Я передаю знаковый тип C-Style int16_t, разделенный на два 8-битных полубайта, через ttn. На принимающем сайте я хочу снова объединить эти два кусочка в подписанный 16-битный тип. Ну, проблема в том, что javascript поддерживает только 32-битные целые числа, что означает простое их слияние с помощью побитовых операций, подобных этому:

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

Я теряю подписанную информацию и просто получаю неподписанную интерпретацию данных, поскольку она не хранится в 32-битном дополнении до двух. Поскольку я еще не очень хорошо знаком со «стандартной библиотекой» javascript, это кажется мне сложной проблемой! Любая помощь будет оценена


person Johannes Deger    schedule 18.06.2017    source источник
comment
Здравствуйте, дорогой разум роя, +1 ;). в js нет бинарного типа. Это либо число (16-битное значение с плавающей запятой или int), либо строка.   -  person Jonas Wilms    schedule 18.06.2017
comment
Эй, спасибо за ответ. Интересно, что в js есть побитовые операторы, поэтому я подумал, что, возможно, также может быть способ интерпретировать 16-битные знаковые типы. Я надеялся на какую-нибудь магию упаковки/распаковки в духе Perl.   -  person Johannes Deger    schedule 18.06.2017
comment
Я давно не играл с дополнением two, но я бы посмотрел здесь (stackoverflow.com/questions/9939760/) и здесь (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ). Я думаю, это направит вас в правильном направлении...   -  person javinor    schedule 18.06.2017
comment
Я думаю, что здесь уже есть решение stackoverflow.com/questions/27911677/   -  person Jonas Wilms    schedule 18.06.2017
comment
Javascript поддерживает побитовые операции с целыми числами размером не более 4 байт. Но при работе с большими числами полезно знать, что тип Javascript Number на самом деле соответствует IEEE754 (двойная точность). Это дает вам 52 бита, доступных для целого числа, и вы можете использовать Math (в основном pow), чтобы помочь вам эмулировать побитовые операции.   -  person Reinsbrain    schedule 18.06.2017


Ответы (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-битное целое число со знаком, но с правильным значением.

person Herman L    schedule 18.06.2017
comment
Ты мужчина. Очевидный подход как-то остался незамеченным! - person Johannes Deger; 18.06.2017