十六进制到 ascii 错误转换

Hex to ascii wrong conversion

本文关键字:转换 错误 ascii 十六进制      更新时间:2023-09-26

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

例如,我想转换这个十六进制:

0340209c

但是,在监视串行连接时,我看到实际发送的是:

03 40 20 c2 9c  

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

我希望有人能引导我朝着正确的方向前进。感谢您的任何回复!

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

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

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

0340209c

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

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

Node-RED 也有二进制支持(请参阅此 GitHub 问题)。文档相当模糊,但看起来您应该使用 Node.js Buffer 对象作为有效负载。

在 Node 中将十六进制转换为 ascii.js(在 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;
}