将缓冲区中的十六进制值转换为整数
Converting hex values in buffer to integer
背景: 我正在使用 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 似乎是我的设备发送的最大值时,我如何创建一个连续的整数范围,这会导致我的整数范围大幅跳跃?
谢谢:)
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>
需要将数据视为两个带符号的 8 位值。根据@forrestj,解决方案是:
valueInt = buf.readInt8(0) * 128 + buf.readInt8(1)
我们也可以通过以下方式将int值转换成原始格式:
byte1 = Math.floor(valueInt / 128)
byte2 = valueInt % 128
背景: 我正在使用 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 似乎是我的设备发送的最大值时,我如何创建一个连续的整数范围,这会导致我的整数范围大幅跳跃?
谢谢:)
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>
需要将数据视为两个带符号的 8 位值。根据@forrestj,解决方案是:
valueInt = buf.readInt8(0) * 128 + buf.readInt8(1)
我们也可以通过以下方式将int值转换成原始格式:
byte1 = Math.floor(valueInt / 128)
byte2 = valueInt % 128