javascript - 如何将负二进制数转换为int?

标签 javascript node.js node-red modbus-tcp

我想通过 Node 红色 modbus Node 从数据源读取数据。范围是 -20000 到 20000,但 Node 不能处理负数,所以我不得不将它们转换为二进制数 (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;

对于可视化,我想使用仪表板 Node ,但因此我需要将 2 个二进制字符串连接在一起并将它们转换为 int。

问题:

Node 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适用于可变长度字符串作为输入,这意味着它无法将最高有效位识别为符号位。换句话说:它像十进制字符串一样解析二进制字符串,使用 -分配;所以你必须使用不同于 parseInt 的方法.

是什么阻碍了您获取 16 位值并将其作为无符号传递?您只需要检查进入您的 javascript 的值是否大于 32767,然后手动进行二补码转换:

然后,对于正“原件”,您的传入数字范围将是 0..20000,对于原始范围 -20000..-1,您的传入数字范围将是 45536..65535(如果我现在认为正确,我没有验证)。这意味着转换很容易:

if( number > 32767 ) {
  number = -65536 + number;
}

或者,对于任何二进制数类型(小于您正在使用的语言的数字大小):
if( number > SIGNED_MAX_INT ) {
  number = -(UNSIGNED_MAX_INT+1) + number;
}

(这些常量并不存在,它们更像是伪代码)

关于javascript - 如何将负二进制数转换为int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61775157/

相关文章:

javascript - 使用 jQuery 从底部向上滑动?

javascript - 通过javascript向数据表添加行

javascript - 访问 Javascript 中未定义的值

javascript - 节点红色数组/如何 "use"具体地方

JavaScript 如何让 Node 在返回 node.js/Node-RED 之前等待?

javascript - 在带有内部调用(js)的函数中使用 setInterval?

javascript - 一个接一个地运行几个 exec() 命令

javascript - 获取循环套接字对象nodejs的属性

node.js - 使用 jade 模板引擎从文件系统刷新 Node.js 中的信息

javascript - pi 感知和导出数据