节点红色将缓冲区转换为值



我使用 snmp 从交换机读取多个 64 位计数器。我得到存储在缓冲区中的值。但是缓冲区的大小没有达到 8 个字节,所以我无法使用"buf.readDoubleBE"转换它。缓冲区增加,计数器增加。以下示例是 snmp 子树节点的输出(仅前两个对象(

msg : Object
    object
    host: "192.168.0.11"
    name: "SWHAR"
    _msgid: "3a45e09a.957c9"
    oid: "1.3.6.1.2.1.31.1.1.1.6"
    payload: array[33]
        [0 … 9]
            0: object
                oid: "1.3.6.1.2.1.31.1.1.1.6.1"
                value: buffer[4]raw
                    0: 0x0
                    1: 0xb9
                    2: 0xda
                    3: 0x4b
            1: object
                oid: "1.3.6.1.2.1.31.1.1.1.6.2"
                value: buffer[1]raw
                    0: 0x0
            2: object ....cut

任何提示如何将其转换为计数器值?我使用以下函数将数组分成单独的消息。我已经尝试使用"readDoubleBE(0,true(",而无需阅读文档;-(它会立即停止 Docker 容器。如果没有 noAssert,我得到了一个超出范围的索引错误。

function shootMsg(element, index, array) {
    node.send ({payload: element.value, topic:'SwMetrics/' + msg.name + '/' + index});
}
msg.payload.forEach(shootMsg);

首先,您不能只对每个value键一视同仁,从您给出的示例来看,第一个密钥的长度为 4 个字节,但第二个只有 1 个字节。

这就是getDouble()失败的原因,因为它试图从第二个value读取 2 个字节,而只有一个字节。

正如我在评论中所说。在 NodeJS 中可以处理的最大整数值是 32 位 Int。

编辑:

看了你之前的问题,我猜 4 字节value实际上是一个 IP 地址,所以你应该把它读成 4 个单独的字节,readInt8()

最新更新