在 JavaScript 中将两个 16 位数字组合并转换为一个 32 位数字(浮点数)

Posted

技术标签:

【中文标题】在 JavaScript 中将两个 16 位数字组合并转换为一个 32 位数字(浮点数)【英文标题】:Combine and convert two 16 bit numbers into one 32 bit number (float) in JavaScript 【发布时间】:2016-06-01 17:59:29 【问题描述】:

我需要构建一个读取工业 modbus 数据的基于 NodeJS 服务器的原型。

我正在读取两个连续的 16 位十进制寄存器,它们为我提供了一个包含两个条目的数组:// eg transaction = [ 17007, -2621 ]// eg transaction = [ 17007, 0000 ]

这个值应该转化为电频率,大约 = ~60.00 (hz)(如果我给出的数据是正确的,至少应该是这样)

我知道我需要组合数组中的两个寄存器值并将数据转换为 32 位浮点数.. 但是如何:

a) 如何组合它们而不将它们投射为它们不是的东西 b) 如何将它们转换为 32 位浮点数

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

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

【问题讨论】:

(我不熟悉 modbus;如果从上下文中可以看出这一点,请原谅。)我不太清楚您希望如何组合这些值。原始值是带符号的 16 位整数,您想基本上连接它们的位并获得生成的 32 位带符号整数吗?如果他们没有签名,那可能是(firstValue << 16) | secondValue;理想情况下,可以避免任何与字符串的转换。您能否提供所需输入/输出对的示例? 我实际上是在寻找 concat 的浮动。我期待 60.00... 或非常接近的值。 (频率变化不会超过一位或两位小数) 它真的为您提供Array 吗?提交他们应该使用Uint16Array 的错误。 【参考方案1】:

您可以使用 DataView 或 ArrayBuffer 直接操作二进制数据,使用定义的类型和字节序。通过将寄存器值写入连续的 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);

【讨论】:

以上是关于在 JavaScript 中将两个 16 位数字组合并转换为一个 32 位数字(浮点数)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?

如何在汇编中将两个十六进制 128 位数字相乘

如何在 Dart 中将数字格式化为千位分隔符

如何将两个每个 8 位的数组(二进制数字字符串组合成一个 16 位的单个字符串?(arduino,移位寄存器)

在Javascript中将零填充到数字的左侧[重复]

如何在熊猫中将 4 位数字转换为小时:分钟时间格式