我有一个UDP(多播)输入节点。它每秒接收一个带有十六进制值的600字节缓冲区。搜索到的值存储在msg.payload [33]到msg.payload [36]的位置。我必须将这四个十六进制值组合为一个十六进制值,并将其转换为十进制。 例如:
msg.payload[33]: 0x00
msg.payload[34]: 0x00
msg.payload[35]: 0x02
msg.payload[36]: 0x3a
现在将这四个十六进制值合并为0x0000023a并将其转换为十进制570。
我对变更和联接节点做了很多尝试,但是没有达到预期的效果。有什么想法吗?我认为功能节点会有所帮助,但是我对此没有任何编码经验。有提示吗?
最诚挚的问候!
编辑:这是udp输入节点之后的原始msg.payload:
20.1.2019, 19:08:25node: 8b0e1675.1c6dc8
msg.payload : buffer[600]
buffer[600]raw
[0 … 9]
[10 … 19]
[20 … 29]
[30 … 39]
30: 0x4
31: 0x0
32: 0x0
33: 0
34: 0x1c
35: 0xfb
36: 0
37: 1
38: 0x8
39: 0x0
[40 … 49]
以此类推,直到600。
答案 0 :(得分:0)
node-red-contrib-binary将为您完成此操作,您需要添加一个与整个缓冲区的格式匹配的模式。模式的语法可以在here中找到。
您最终会得到类似的东西:
... value: b32, ...
然后它将输出带有数字的msg.payload.value
。
我是一个功能节点,假设您以msg.paylaod
的形式传入缓冲区,则将是这样的:
var value = msg.paylaod.readInt32BE(33);
编辑:
如果输入只是一个短数组,则可以在函数节点中执行以下操作:
var value = (mag.payload[0] << 8) + (mag.payload[1] << 24)
+ (msg.payload[2] << 16) + (msg.payload[3] << 8);
或者只是将数组转换为缓冲区并像以前一样读取:
var buff = Buffer.from(msg.payload);
var value = buff.readInt32BE(0);