Интерпретация 16-битных значений Sphero (например, в Collisions)
Я использую Cylon.js и Node.js для работы со Sphero, и я не уверен, каким образом я должен восстановить 16-битные значения из данных, возвращенных из события столкновения.
Документы подразумевают, что они должны быть подписаны 16-разрядными целыми числами и что числа идут в байтовом порядке (MSB, LSB), но я получаю странные значения, когда пытаюсь преобразовать два байта в отрицательные значения мощности (например, удары). сзади или слева).
Код Javascript, который я использую для преобразования двухбайтового значения Sphero:
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 положительны, они, по-видимому, преобразуются правильно.
Итак, короткая версия вопроса: как правильно преобразовать два байта в целое число со знаком?