我正在使用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)
答案 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