如何将Node.js原始缓冲区数据显示为十六进制字符串


95

以下代码使用SerialPort模块来侦听来自蓝牙连接的数据。

我希望在控制台中看到十六进制格式的数据流。但是控制台仅显示了一些奇怪的符号。我想知道如何在控制台中解码和显示数据。

var serialPort = new SerialPort("/dev/tty.EV3-SerialPort", {
  parser: SP.parsers.raw
}, false); // this is the openImmediately flag [default is true]

serialPort.open(function () {
 console.log('open');
 serialPort.on('data', function(data) {
   var buff = new Buffer(data, 'utf8'); //no sure about this
  console.log('data received: ' + buff.toString());
 });  
});

12
数据已经是缓冲区,无需转换。然后:data.toString('hex');
Laurent Perrin

Answers:


207

此代码将数据缓冲区显示为十六进制字符串:

buff.toString('hex');

4
你知道怎么做相反吗?
bubakazouba

20
bubakazouba:新的Buffer(buf.toString('hex'),'hex');
瑟里

2
[DEP0005] DeprecationWarning:由于安全性和可用性问题,不建议使用Buffer()。请改用Buffer.alloc(),Buffer.allocUnsafe()或Buffer.from()方法。所以现在应该是Buffer.from( buf.toString('hex'),'hex');
飘飘

还给我[object ArrayBuffer]吗?怎么了?
Mamdouh Saeed

-2

最佳答案是最简单的方法。

替代方法:

data = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);

Array.prototype.map.call(new Uint8Array(data),
               x => ('00' + x.toString(16)).slice(-2))
        .join('').match(/[a-fA-F0-9]{2}/g).reverse().join('');

1
这个答案实际上对我很有用,因为我必须将其与“-”连接起来才能与C#互操作。已投票。
Edza
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.