将缓冲区中的十六进制值转换为整数

时间:2016-01-24 10:51:16

标签: node.js binary hex buffer

后台:我使用node.js通过串行连接从设备获取音量设置。我需要将此数据作为整数值获取。

我将数据放在缓冲区中(' buf'),并使用readInt16BE()转换为int,如下所示:

console.log( buf )
console.log( buf.readInt16BE(0) )

当我调整外部设备时,它给出了以下输出:

<Buffer 00 7e>
126
<Buffer 00 7f>
127
<Buffer 01 00>
256
<Buffer 01 01>
257
<Buffer 01 02>
258

问题:一切顺利,直到我们达到127,然后我们跳到256.也许它与有符号和无符号整数有关 - 我不知道!

不幸的是,我对外部设备的文档非常有限,我不得不对其进行逆向工程!是否有可能只发送一个7位值?希望有办法解决这个问题吗?

关于解决方案 - 我还必须能够从int转换回这种格式!

问题:当7F似乎是我的设备发送的最大值时,如何创建一个连续的整数范围,这会导致我的整数范围大幅跳跃?

谢谢:)

2 个答案:

答案 0 :(得分:1)

127是带符号的8位整数的最大值。如果整数溢出到128处的下一个字节,则可以安全地假设您没有被发送16位值,而是发送2个带符号的8位值,并且将该值读取为16位整数将是不正确的。

我首先使用第一个字节作为128的乘数并添加第二个字节,这将给出你正在寻找的系列。

buf = Buffer([0,127]) //<Buffer 00 7f>
buf.readInt8(0) * 128 + buf.readInt8(1)
>127

buf = Buffer([1,0]) //<Buffer 01 00>
buf.readInt8(0) * 128 + buf.readInt8(1)
>128

buf = Buffer([1,1]) //<Buffer 01 01>
buf.readInt8(0) * 128 + buf.readInt8(1)
>129 

返回的方法是除以128,将其向下舍入到第一个字节的最接近的整数,第二个字节包含余数。

i = 129
buf = Buffer([Math.floor(i / 128), i % 128])
<Buffer 01 01>

答案 1 :(得分:0)

需要将数据视为两个带符号的8位值。根据@forrestj,解决方案是:

valueInt = buf.readInt8(0) * 128 + buf.readInt8(1)

我们还可以通过执行以下操作将int值转换为原始格式:

byte1 = Math.floor(valueInt / 128)
byte2 = valueInt % 128