2016-01-17 175 views
0

我有一個JavaScript函數將HEX轉換爲ASCII,然後將其輸出到串行連接。 但是,當監視串行連接時,我可以看到轉換後的輸出不正確。十六進制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' 

舉個例子,我想這個十六進制轉換:

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-chunk? – hindmost

回答

0

發生這種情況的原因是JavaScript和Node-RED對文本使用UTF-8編碼,其中Unicode字符編號U + 009c編碼爲c2 9c。 (請注意,ASCII實際上是一個從0x00到0x7f的7位字符集,從0x80到0xff的8位代碼取決於字符集或編碼。)

Node-RED也支持二進制(請參閱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; 
}