2016-01-24 93 views
0

背景:我使用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

是否有意义为您的设备返回负数?它看起来像设备使用该位作为符号,在这种情况下,将缓冲区作为16位值读取是不正确的。 – forrestj

回答

0

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> 
+0

非常感谢 - 这完全解决了我的问题。 有没有办法做相反的,所以132 == 0x00和0x04? – gef

+0

我看到你把它整理好了,当我有更多时间更清晰时,我编辑了我的帖子。很高兴看到你得到它:) – forrestj

0

需要将数据视为两个有符号的8位值。按照@forrestj的解决办法是要做到:

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

我们也可以通过执行转换的int值成原来的格式如下:

byte1 = Math.floor(valueInt/128) 
byte2 = valueInt % 128 
相关问题