Как правильно работать с чтением байтов в JavaScript?Как правильно выбрать позицию - PullRequest
0 голосов
/ 10 июня 2019

Мне нужно прочитать некоторые десятичные значения из HEX.

Например, у меня есть 2-тарифный учет электроэнергии, и с помощью устройства LoRa IOT я читаю и отправляю 2 целых значения 33780 и 6687 (киловатт) на свой сервер,

Они закодированы в этом шестнадцатеричном сообщении с 4 по 6 и с 8 по 10 позицию.С JavaScript мне нужно преобразовать обратно в целочисленные значения.

80 ff 02 00 83 f4 03 00 1a 1f fe f1

00 83 f4 = 33780

00 4a 4f = 6687

Итак, у меня есть пример JavaScript, но я не могу подобрать правильные позиции для чтения.Проблема в строках 2 и 3, конечно.

function Decoder(bytes) {
  var T2 = bytes[1]<<24>>16 | bytes[0];
  var T1 = bytes[4]<<6 | bytes[3];

  return {
    vysoky_tarif: T2,
    nizky_tarif: T1
    
  }
}

Спасибо

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Да, "80 ff 02 00 83 f4 03 00 1a 1f fe f1" - это строка, которую сервер получает и должен анализировать данные в байтах 4 - 6 и 8 - 10.

Разница между вашей строкой и байтами такая же, как между картинкой и вами. Не имеет смысла говорить с вашей фотографией.

Итак, сначала мы должны разобрать эту строку в числа, с которыми мы можем иметь дело. Затем нам нужно получить числа, которые вы ищете.

имо. 24-битные числа довольно редки, для 8, 16 и 32-битных значений вы можете использовать DataView , чтобы получить / установить значения прямо в массиве, для 24-битных нам нужно получить байты и построить целые числа вручную.

// your input, a string
var text = "80 ff 02 00 83 f4 03 00 1a 1f fe f1";

// parsed and converted into an Array of Bytes.
var bytes = new Uint8Array(text.split(" ").map(v => parseInt(v, 16)));

// a utility to read int24 from the array
function getInt24(bytes, index) {
  return (bytes[index] << 24 | bytes[index + 1] << 16 | bytes[index + 2]<<8) >> 8;
}

// 1st byte is at index 0
var v1 = getInt24(bytes, 3);
var v2 = getInt24(bytes, 7);

console.log(v1, v2);
.as-console-wrapper{top:0;max-height:100%!important}
0 голосов
/ 10 июня 2019

Это окончательный рабочий код:

function Decoder(bytes) {

// a utility to read int24 from the array
function getInt24(bytes, index) { return (bytes[index] << 24 | bytes[index + 1] << 16 | bytes[index + 2]<<8) >> 8;
}

// 1st byte is at index 0
var v1 = getInt24(bytes, 3);
var v2 = getInt24(bytes, 7);


return {
    vysoky_tarif: v1,
    nizky_tarif: v2
       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...