Javascript JS从缓冲区读取字节

Javascript JS从缓冲区读取字节,javascript,node.js,byte,buffer,Javascript,Node.js,Byte,Buffer,我可以用一些Stringhacking解析缓冲区,但是必须有一种更直接的方法从缓冲区数据到最终值。 我一直在尝试使用一些缓冲区.readInt8,readInt16LE等,但运气不好。第一个和最后一个值为2字节;如果我理解这里涉及的词汇。另外两对一 从下面的示例中,我希望通过parseInt(buffer.readUInt16BE(6)|(buffer.readUInt16BE(7)获得温度(228),这应该是您要查找的: 设Buf=Buffer.from(“a4c1380a701400e423

我可以用一些
String
hacking解析缓冲区,但是必须有一种更直接的方法从缓冲区数据到最终值。 我一直在尝试使用一些
缓冲区.readInt8
readInt16LE
等,但运气不好。第一个和最后一个值为2字节;如果我理解这里涉及的词汇。另外两对一


从下面的示例中,我希望通过
parseInt(buffer.readUInt16BE(6)|(buffer.readUInt16BE(7)获得温度(228),这应该是您要查找的:

设Buf=Buffer.from(“a4c1380a701400e4233c0ac5c2”,“hex”);
//让Buf作为蓝牙温度计的缓冲区。
//这里使用的是示例数据,与您的问题相匹配。
设温度c=Buf.readUInt16BE(6)/10
让湿度=Buf.readUIntBE(8,1)
让电池=Buf.readUIntBE(9,1)
设电池V=(Buf.readUInt16BE(10))/1000
//只是为了证实它的有效性。。。
控制台日志(温度、湿度、电池、电池)
//样本输出:22.8 35 60 2.757(正确)

每个字节在偏移量上都是
1
。因此,如果我们把
6
读成2个字节,然后再把
7
,我们实际上是在从温度上读第二个字节。记住要考虑到16位是2个字节;节点是逐字节偏移的。

很好!!!谢谢;这很有意义。你知道为什么
Buf.readUInt16BE(6)!==(Buf.readUIntBE(6,1)这将是您通常读取16位be数的方式,但由于NodeJS已将其解析为16位be数,因此您不必这样做。
    // (example data in comments)
    
    const buffer = peripheral.advertisement.serviceData[0].data;
    // a4c1380a701400e4233c0ac5c2

    const lameParsing = {
      // Starts with the address a4:c1:38:0a:70:14, then the values
      temperatureC: parseInt(buffer.toString("hex").slice(12, 16), 16) / 10,
      // 22.8
      humidity: parseInt(buffer.toString("hex").slice(16, 18), 16),
      // 35
      battery: parseInt(buffer.toString("hex").slice(18, 20), 16),
      // 60
      batteryV: parseInt(buffer.toString("hex").slice(20, 24), 16) / 1000
      // 2.757
    };