在mqtt消息回调中处理ArrayBuffer

问题描述

mqtt客户端向特定主题发送二进制消息。我的node.js客户端订阅了该主题并接收了二进制数据。由于我们的架构有效载荷是Int16Array。但是我无法将其成功转换为Javascript数组。 // uint16数组[255,256,257,258]作为消息有效负载发送,其内容<ff 00 00 01 01 01 02 01>

当我这样做时:

 mqttClient.on("message",(topic,payload) => {
      console.log(payload.buffer);
   })

输出如下:

ArrayBuffer {
  [Uint8Contents]: <30 11 00 07 74 65 73 74 6f 7a 69 ff 00 00 01 01 01 02 01>,byteLength: 19
}

由于长度长而不能转换为Int16Array 它还包含比原始消息更多的字节

解决方法

似乎原始字节存在于有效负载的末尾,由于某些原因而偏移了。

缓冲区还包含内部的偏移量和字节长度信息。通过使用它们,铸造应该成功。

let arrayBuffer = payload.buffer.slice(payload.byteOffset,payload.byteOffset + payload.byteLength)
let int16Array = new Int16Array(arrayBuffer)
let array = Array.from(arrayBuffer)