2016-01-17 3 views
0

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

У меня есть этот яваскрипта код:

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). Я выводю на последовательное соединение через узел-красный. Выходной узел только, кажется, принимает текст ascii, а не HEX.

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

+0

Что вы точно передать вашей функции? Что вы получаете в результате и какой желаемый результат? – hindmost

+0

Извините, Я передаю строку, которую я привел в качестве примера: 0340209c Я просто хочу, чтобы это преобразованное в ascii, и когда я контролирую последовательное соединение, он должен выводить «03 40 20 9c» Но теперь он выводит: «03 40 20 c2 9c ". – Bart

+0

Другими словами, вы просто хотите разбить эту строку на два char-chunks? – hindmost

ответ

0

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

Узла-КРАСНЫЙ также имеет двоичную поддержку (см this GitHub issue). Документация довольно расплывчата, но похоже, что вы должны использовать объект буфера Node.js в качестве полезной нагрузки.

1

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

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

msg.payload является впрыскивается строка, как:

0340209c 

Контролируя последовательного соединения, теперь читает правильную команду!

0

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

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; 
} 
Смежные вопросы