后台:我使用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似乎是我的设备发送的最大值时,如何创建一个连续的整数范围,这会导致我的整数范围大幅跳跃?
谢谢:)
答案 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