如何将nodejs的原始缓冲数据显示为十六进制字符串

129
下面的代码使用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());
 });  
});

13
数据已经是缓冲区,无需转换。然后:data.toString('hex'); - Laurent Perrin
2个回答

282

这段代码将会把数据缓冲区以十六进制字符串的形式展示:

buff.toString('hex');

6
你知道如何进行反向操作吗? - bubakazouba
27
bubakazouba: new Buffer(buf.toString('hex'), 'hex'); 的意思是将一个十六进制字符串转换为二进制数据,并将其存储在一个缓冲区中。 - Seryh
7
现在出现了“[DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.”的警告。因此,应该使用Buffer.alloc()Buffer.allocUnsafe()Buffer.from()方法来代替Buffer()。可以使用以下代码:Buffer.from(buf.toString('hex'), 'hex'); - flob
2
它对我返回了[object ArrayBuffer]?出了什么问题? - Mamdouh Saeed

3

最简单的方法是选择顶部答案。

另一种方法:

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('');

5
这个答案对我来说非常有用,因为我需要使用“-”将它与C#进行互操作。我点了赞。 - Edza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接