为什么不能在NodeJS中正确获取我的负数?

时间:2018-11-08 09:47:16

标签: javascript node.js

我正在使用nodeJS来解析一些HEX字符串,我正在尝试使用parseInt将HEX值转换为整数值,但是在使用负数时遇到了一些困难,我不知道为什么。

我有以下十六进制字符串D3FFBDFFF900以这种方式编码以下整数x:-0.45*100 y:-0.67*100 z:2.49*100

D3FF | BDFF | F900 => -0.45*100 | -0.64*100 | 2.49*100

并且我创建了以下代码段(并且现在我要在那里除以100了)

var x = "D3FFBDFFF900".substring(0,4);
var y = "D3FFBDFFF900".substring(4,8);
var z = "D3FFBDFFF900".substring(8);

console.log("x:"+x);
console.log("y:"+y);
console.log("z:"+z);

console.log("parseInt x "+parseInt(x.toString(16),16));
console.log("parseInt y "+parseInt(y.toString(16),16));
console.log("parseInt z "+parseInt(z.toString(16),16));

为什么parseInt至少不能解码x = -45,y = -67和z = 249的值,而我却得到上面的输出?

预先感谢

编辑:对数据进行编码的方式如下所示,其中打印仅将原始的十六进制字符串打印到串行总线中

#define NIBBLE_TO_HEX_CHAR(i) ((i <= 9) ? ('0' + i) : ('A' - 10 + i))
#define HIGH_NIBBLE(i) ((i >> 4) & 0x0F)
#define LOW_NIBBLE(i) (i & 0x0F)

 for (int i = 0; i < size; ++i) {
            print(static_cast<char>(NIBBLE_TO_HEX_CHAR(HIGH_NIBBLE(payload[i]))));
            print(static_cast<char>(NIBBLE_TO_HEX_CHAR(LOW_NIBBLE(payload[i]))));
        }

和值x,y,z如下所示,其中accelerometer.getX() -> double的类型

x = (int16_t)(accelerometer.getX()*100)
y = (int16_t)(accelerometer.getX()*100)
z = (int16_t)(accelerometer.getX()*100)

1 个答案:

答案 0 :(得分:0)

解析器应该如何知道您交换了半字节并使用4位十六进制?

0xD3FF = 15 * 1 + 15 * 16 + 3 * 256 + 13 * 4096 = 54271

-45 = -0x2D

-67 = -0x43

249 = 0xF9

解析器执行正确的工作。

要解析接收到的十六进制值,您必须交换高半字节和低半字节:

D3FF => FFD3

接下来,您必须将十六进制解析为dec。如果您的值> = 0x8000,则必须反转二进制表示形式并添加1

0xFFD3 = 65491> 0x8000 = 32768

-(〜65491&0xFFFF)+1 = -43