问题描述
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)