Hex в ascii неправильное преобразование

У меня есть функция javascript для преобразования из HEX в ASCII, а затем вывод ее в последовательное соединение. Однако при наблюдении за последовательным соединением я вижу, что преобразованный вывод неверен.

У меня есть этот код javascript:

function hex2a(hexx) {
var hex = hexx.toString();//force conversion
var str = '';
for (var i = 0; i < hex.length; i += 2)
    str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
return str;
}
return {payload: hex2a(msg.payload)}; // returns '2460'

В качестве примера я хочу преобразовать этот HEX:

0340209c

НО, при мониторинге последовательного соединения я вижу, что на самом деле отправляется следующее:

03 40 20 c2 9c  

Таким образом, устройство отвечает сообщением об ошибке. Вот ломаю голову. Некоторые шестнадцатеричные команды конвертируются правильно (например, 0340615b). Я вывожу последовательное соединение через node-red. Выходной узел, кажется, принимает только текст ascii, а не HEX.

Я надеюсь, что кто-то может направить меня в правильном направлении. Спасибо за любой ответ!


person Bart    schedule 17.01.2016    source источник
comment
Что именно вы передаете своей функции? Что вы получаете в результате и каков желаемый результат?   -  person hindmost    schedule 17.01.2016
comment
Извините, я передаю строку, которую я дал в качестве примера: 0340209c Я просто хочу, чтобы это было преобразовано в ascii, и когда я отслеживаю последовательное соединение, оно должно выводить 03 40 20 9c Но теперь оно выводит: 03 40 20 c2 9c.   -  person Bart    schedule 17.01.2016
comment
Другими словами, вы просто хотите разбить эту строку на два фрагмента символов?   -  person hindmost    schedule 17.01.2016


Ответы (4)


Это происходит потому, что JavaScript и Node-RED используют для текста кодировку UTF-8, где номер символа Unicode U+009c кодируется как c2 9c. (Обратите внимание, что ASCII на самом деле представляет собой 7-битный набор символов от 0x00 до 0x7f, а 8-битные коды от 0x80 до 0xff зависят от набора символов или кодировки.)

Node-RED также поддерживает двоичные файлы (см. эту проблему GitHub). Документация довольно расплывчата, но похоже, что вы должны использовать объект Node.js Buffer в качестве полезной нагрузки.

person Metabolix    schedule 17.01.2016

Спасибо! @Metabolix за то, что указал мне правильное направление!! Я решил свою проблему, преобразовав мою строку HEX в буфер со следующим кодом.

return {payload: new Buffer(msg.payload, "hex")};

msg.payload представляет собой введенную строку, например:

0340209c

При мониторинге последовательного соединения теперь считывается правильная команда!

person Bart    schedule 17.01.2016

Преобразование hex в ascii в Node.js (проверено в v5+)

const hex = '...';
const ascii = new Buffer(hex, 'hex');

https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings

person chovy    schedule 08.09.2016

Попробуй это:

function toAscii(hex, delimiter) {
  var outputstr = '';
  inputstr = inputstr.replace(/^(0x)?/g, '');
  inputstr = inputstr.replace(/[^A-Fa-f0-9]/g, '');
  inputstr = inputstr.split('');
  for(var i=0; i<inputstr.length; i+=2) outputstr += String.fromCharCode(parseInt(inputstr[i]+''+inputstr[i+1], 16));
  return outputstr;
} 
person gus    schedule 16.08.2017