2016-02-20 434 views
3

我需要构建一个基于NodeJS服务器的原型来读取工业modbus数据。在JavaScript中将两个16位数组合并转换为一个32位数(浮点数)

我读我提供一个阵列,两个条目两个连续的16位小数寄存器:
// eg transaction = [ 17007, -2621 ]// eg transaction = [ 17007, 0000 ]

此值应转化为电频率,约=〜60.00(HZ)(至少它应该如果我给出的数据是正确的)

我知道我需要两个寄存器值数组中结合和转换数据要么32位浮点..但如何:

一)如何将它们组合起来而不用将它们铸造为一些他们不
二)如何将它们隐蔽到32位浮点

我想我需要使用某种类型的parseInt()然后toString(10) - 一个建议是,将每个使用parseInt(num, 10).toString(16)为十六进制,然后再转换是加入十六进制到一个字符串或可能浮动使用parseFloat()但又是如何首先加入两个单独的部分。

我还没有找到解决方案,令人惊讶的。

+0

(我不熟悉modbus;如果这应该从上下文中显而易见,请原谅)。我不太清楚你想如何组合这些值。原始值是带符号的16位整数,并且您希望基本连接它们的位并获得生成的32位有符号整数?如果它们没有签名,那可能就像'(firstValue << 16)| secondValue';理想情况下,可以避免任何字符串转换。你能提供一个期望的输入/输出对的例子吗? –

+0

我实际上是在寻找concat的float。我期待60.00 ...或其他非常接近的东西。 (频率不会超过一位或两位小数) –

+0

它是否真的为您提供'Array'?提交他们应该使用'Uint16Array'的错误。 – Bergi

回答

2

您可以使用ArrayBufferDataView直接操作二进制数据,使用定义的类型和字节顺序。通过连续为16位整数写入寄存器值和解释结果作为大端(false)32位浮点,我们得到你正在寻找的结果是:

var buffer = new ArrayBuffer(4); 
 
var view = new DataView(buffer); 
 

 
view.setInt16(0, 17007, false); 
 
view.setInt16(2, -2621, false); 
 

 
document.body.textContent = view.getFloat32(0, false);

+0

杰里米确实很完美,谢谢 –

相关问题