0

我正在使用Cylon.js和 Node.js 来处理 Sphero,但我不确定我应该如何从碰撞事件返回的数据中重建 16 位值。

文档暗示它们应该是有符号的 16 位整数,并且数字以(MSB,LSB)字节顺序出现,但是当我尝试将两个字节转换为应该是负功率额定值(例如影响从后面或从左边)。

我用来转换双字节 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 值为正,因此它们似乎正在正确转换。

所以问题的简短版本是,将两个字节转换为有符号整数的正确方法是什么?

4

0 回答 0