错误:十六进制字符串无效



这是我的节点js代码

if (protocol == '01') {
  console.log('...goint to get Ack Obj...');
  var o = getAckObj(hexString);
  console.log('...ack obj received...');
  var msg = ackMsg(o);
  console.log('..going to write buffer...');
  socket.write(new Buffer(msg, 'hex')); //, 'binary');
  console.log('Server sent welcome: ' + msg);
}
.....
function ackMsg(dataObj) {
  var ackText = '';
  dataObj.len = '05'; //for ack msg its always 05
  var e = crc16(dataObj.len + dataObj.protocol + dataObj.serial, 'hex');
  dataObj.error = e.toString(16);
  return dataObj.start + dataObj.len + dataObj.protocol + dataObj.serial + dataObj.error + dataObj.stop;
}

下面是十六进制字符串中的值78780d010387113120864842000ccbe40d0a

在控制台上输出

...goint to get Ack Obj...
...ack obj received...
..going to write buffer...
buffer.js:348
      ret = this.parent.hexWrite(string, this.offset + offset, length);

你确定字符串的长度是均匀的吗?当您提供的十六进制字符串是奇数(len % 2 != 0)而不是所需的偶数时,缓冲区会引发该(不清楚的)错误消息。

一个好的测试是记录你拥有的十六进制字符串,然后在 Python 中尝试它:

>>> '8'.decode('hex')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/encodings/hex_codec.py", line 42, in hex_decode
    output = binascii.a2b_hex(input)
TypeError: Odd-length string

我已经在 GitHub 上打开了一个拉取请求,以修复错误消息以使其更清晰一些:https://github.com/nodejs/node/pull/4877/files

我现在

也遇到了这个问题,使用旧的io.js,节点版本是1.2。

这是一个代码示例,我遇到了像您这样的错误:

const resultBuffer = new Buffer.concat(chunks.items);
fs.writeFileSync(resultFilePath, resultBuffer, {encoding: 'hex'});

我检查了chunks.items的两倍,然后使用了Geewax提到的简单的十六进制奇数值@JJ发现在我的情况下,问题在于节点fs模块和缓冲区之间的交互。

为了使它正常工作,我已经从将原始缓冲区传递到具有正确编码的字符串中更改:

...
fs.writeFileSync(resultFilePath, resultBuffer.toString('hex'), {encoding: 'hex'});

也许有人觉得这很有用。