十六进制到 ascii 的错误转换

Hex to ascii wrong conversion

我有一个 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。

我希望有人能指导我正确的方向。 感谢您的任何回复!

发生这种情况是因为 JavaScript 和 Node-RED 对文本使用 UTF-8 编码,其中 Unicode 字符编号 U+009c 被编码为 c2 9c。 (请注意,ASCII实际上是0x00到0x7f的7位字符集,0x80到0xff的8位代码取决于字符集或编码。)

Node-RED 也有二进制支持(参见 this GitHub issue)。文档相当模糊,但看起来您应该使用 Node.js 缓冲区对象作为有效负载。

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

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

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

0340209c

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

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

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

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

试试这个:

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;
}