Проблема кодировщика Javascript с форматом и HEX

Я работаю над кодировщиком для LoRaWAN с JavaScript. Я получаю это поле данных:

{“header”: 6,“sunrise”: -30,“sunset”: 30,“lat”: 65.500226,“long”: 24.833547}

И мне нужно закодировать шестнадцатеричное сообщение, мой код:

var header = byteToHex(object.header);
var sunrise =byteToHex(object.sunrise);
var sunset = byteToHex(object.sunset);
var la = parseInt(object.lat100,10);
var lat = swap16(la);
var lo = parseInt(object.long100,10);
var lon = swap16(lo);
var message={};
if (object.header === 6){
    message = (lon)|(lat<<8);
    bytes = message;
}
return hexToBytes(bytes.toString(16));

Функции byteToHex/swap16 определены как:

function byteToHex(byte) {
    var unsignedByte = byte & 0xff;
    if (unsignedByte < 16) {
        return ‘0’ + unsignedByte.toString(16);
    } else {
        return unsignedByte.toString(16);
    }
}

function swap16(val) {
    return ((val & 0xFF) << 8) | ((val >> 8) & 0xFF);
}

Тестирование с возвратным сообщением = lon дает B3 09 в шестнадцатеричном формате. Тестирование с сообщением = lon | lat ‹‹8 return 96 BB 09, но результат, который я ищу, это 96 19 B3 09 (составляя lon + lat).

Какие-нибудь советы? Что я делаю неправильно?


person RobMBSos    schedule 25.09.2019    source источник
comment
Я сомневаюсь, что вы получаете данные в таком формате. Фигурные кавычки там недействительны. Также в вашем коде...   -  person trincot    schedule 25.09.2019
comment
Возможный дубликат преобразования массива байтов в строку Hex в javascript   -  person VirxEC    schedule 25.09.2019
comment
Поскольку lon и lat являются 16-битными числами, вы потеряете информацию с (lon)|(lat<<8). Вы имели в виду lon|(lat<<16)?   -  person trincot    schedule 25.09.2019
comment
@trincot скопировал из бэкенда и изменил мой ответ; поля {заголовок: 6, восход: -30, закат: 30, широта: 65,500226, долгота: 24,833547}   -  person RobMBSos    schedule 25.09.2019


Ответы (1)


Я решил эту проблему, используя этот код:

    var long = object.long;
    var lat = object.lat;
    lat = parseInt(lat*100,10);
    var la = swap16(lat);
    la = la.toString(16);
    long = parseInt(long*100,10);
    var lon = swap16(long);
    lon = lon.toString(16);
    var header = object.header;
    var result= la;
    result+= lon;
    result= result.toString(16);
    bytes = hexToBytes(result);
  }
  }
  return bytes;

Теперь ответ:

// encoded payload:
96 19 B3 09
person RobMBSos    schedule 26.09.2019