c0n*_*r3f 6 javascript node.js node-red modbus-tcp
我想通过节点红色 modbus 节点从数据源读取数据。范围是 -20000 到 20000,但节点无法处理负数,所以我不得不将它们转换为二进制数 (DWORD),将它们拆分为低位和高位字,然后将这些字转换回整数。
var low
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
var a = msg.payload
if (a >= 0){
a = dec2bin(a);
a = parseInt(a,2);
} else {
a = dec2bin(a);
a = a.substr(16);
a = parseInt(a,2);
}
low = { payload: a };
return low;
Run Code Online (Sandbox Code Playgroud)
对于可视化,我想使用仪表板节点,但因此我需要将 2 个二进制字符串连接在一起并将它们转换为 int。
问题:
节点 red 将它们转换为 qword,因此二进制数 1111 1111 1111 1111 1111 1100 0001 1000 被视为 4.294.966.296?,而不是 -1000。但是,如果我用 1 个酸橙填充下一个剩余部分,那么: 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100 0001 1000 输出 18446744073709552000
谢谢
parseInt
适用于可变长度字符串作为输入,这意味着它无法将最高有效位识别为符号位。换句话说:它像十进制字符串一样解析二进制字符串,使用-
as 符号;所以你必须使用与 不同的方法parseInt
。
是什么阻碍您获取该 16 位值并将其作为无符号传递?您只需检查传入 javascript 的值是否大于 32767,然后手动进行二补转换:
那么,您的传入数字范围将是 0..20000(对于正“原始”)和 45536..65535(对于原始范围 -20000..-1)(如果我现在认为正确,我没有验证这一点)。这意味着转换很容易:
if( number > 32767 ) {
number = -65536 + number;
}
Run Code Online (Sandbox Code Playgroud)
或者,对于任何二进制数字类型(小于您正在使用的语言的数字大小):
if( number > SIGNED_MAX_INT ) {
number = -(UNSIGNED_MAX_INT+1) + number;
}
Run Code Online (Sandbox Code Playgroud)
(这些常量并不像所写的那样存在,它们更像是伪代码)
归档时间: |
|
查看次数: |
382 次 |
最近记录: |