十六进制到ascii错误的转换

时间:2016-01-17 12:14:49

标签: javascript hex ascii node-red

我有一个javascript函数可以从HEX转换为ASCII,然后将其输出到串行连接。 但是,在监视串行连接时,我可以看到转换后的输出不正确。

我有这个javascript代码:

Temperature.findOneAndUpdate(dailyQuery,
    { $inc: { temperature_sum : thermometer.temperature, count : 1 },
        $max :{ max_temp : thermometer.temperature},
        $min :{ min_temp : thermometer.temperature}},
    {upsert : true}, function(err, dailyTemp) {
    if (err) throw err;
    console.error(dailyTemp);
});

举个例子,我想转换这个HEX:

MongoError: exception: Invalid modifier specified $min

但是,当监控串行连接时,我发现实际发送的内容是:

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'

因此设备应答错误消息。 我在这里挠头。某些十六进制命令可以正确转换(例如0340615b)。 我通过node-red输出到串行连接。 输出节点似乎只接受ascii文本而不是HEX。

我希望有人可以指导我朝着正确的方向前进。 谢谢你的回复!

4 个答案:

答案 0 :(得分:1)

THX! @Metabolix指出我正确的方向!! 我通过使用以下代码将我的HEX字符串转换为缓冲区来解决我的问题。

\r\n

msg.payload是一个注入的字符串,如:

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

在监控串行连接时,它现在会读取正确的命令!

答案 1 :(得分: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 Buffer对象作为有效负载。

答案 2 :(得分:0)

在Node.js中将十六进制转换为ascii(在v5 +中测试)

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

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

答案 3 :(得分: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;
}