我正在使用Cylon.js和Node.js来处理Sphero,我不确定我应该如何从碰撞事件返回的数据中重建16位值。
文档暗示它们应该被签名为16位整数,并且数字以(MSB,LSB)字节顺序进入,但是当我尝试将两个字节转换为应该是负额定值时,我得到奇数值(例如来自后方或左侧的冲击。)
我用来转换双bhere Sphero值的Javascript代码是:
function convertToSignedInt(msb, lsb) {
var negative = msb > 128;
if (negative) {
msb -= 128;
}
var value = msb*256 + lsb;
if (negative) {
value = 0 - value;
}
return value;
}
给出如下的原始碰撞数据:
{"SOP1":255,"SOP2":254,"ID_CODE":7,"DLEN":17,"DATA":[18,31,255,104,0,0,1,0,67,0,6,0,0,9,1,95],"CHK":156}
然后我尝试使用以下方法将DATA属性转换为更易读的对象:
function convertCollisionData(data) {
var obj = {};
obj.xPower = convertToSignedInt(data[0], data[1]);
obj.yPower = convertToSignedInt(data[2], data[3]);
obj.zPower = convertToSignedInt(data[4], data[5]);
obj.impactAxis = data[6];
obj.xImpact = convertToSignedInt(data[7], data[8]);
obj.yImpact = convertToSignedInt(data[9], data[10]);
obj.speed = data[11];
return obj;
}
想出这个:
{"xPower":4639,"yPower":-32616,"zPower":0
,"impactAxis":1,"xImpact":67,"yImpact":6,"speed":0}
显然yPower是完全错误的,因为这是一个右侧(正X)碰撞。由于xImpact和yImpact值为正,因此它们似乎正在正确转换。
所以问题的简短版本是,将两个字节转换为有符号整数的正确方法是什么?