Как совместить два 8-битных числа с 16-битными в Octave - PullRequest
1 голос
/ 11 ноября 2019

Я работаю с данными от GY-87 (модуль Acc и гироскопического датчика). Данные, которые я получил от него, имеют форму ACCEL_YOUT_HIGH & ACCEL_YOUT_LOW для оси Y, задающей значения HIGH и LOW соответственно. Мне сказали, что «регистры High и Low имеют 8-битный характер, поэтому комбинация обоих будет 16-битными данными со знаком». Но я действительно не могу понять, как объединить их с 16-битными данными. Вот пример: ACCEL_YOUT_HIGH = 254 ACCEL_YOUT_LOW = 144

Я уже пробовал способ JAVAScript, но он не работает в октаве.

var number8Bit1 = firstNumber & 0xff;
var number8Bit2 = ((firstNumber >> 8) & 0xff);

1 Ответ

2 голосов
/ 11 ноября 2019

Поскольку ваши данные имеют 16-разрядную подпись, я думаю, что наиболее элегантное решение - использовать typecast (как прокомментировал Энди).

Для правильной работы решения Typecast вы должны сделать следующее:

  1. Привести каждое значение к uint8
  2. Создать массив из двух uint8элементы (поместите сначала нижний элемент, потому что наши системы little-endian )
  3. Используйте typecast для преобразования двух байтов в один элемент int16.
  4. Приведите результат к double (вы можете пропустить эту часть, но это обычная практика - на случай, если вам нужно применить вычисления к результату).

Пример кода:

high = 254;
low = 144; 
res = double(typecast([uint8(low), uint8(high)], 'int16'))

Результат:

res = -368

В случае, если вы хотите использовать чисто математические операции (как прокомментировал Сами),Вы можете сделать это следующим образом:

res = high*256 + low;
if (res >= 2^15)
    res = res - 2^16; %Correct the sign.
end

Я нахожу это менее элегантным, потому что утверждение if неясно ...


Вы также можете использовать битное смещение, bitor и typecast (как прокомментировал Крис).
Похоже, код C res = (short)((high << 8) | low):

res = typecast(uint16(bitor(bitshift(high, 8), low)), 'int16');

Я считаю это менее элегантным, чем первое решение, потому что сдвиги или операции не являются естественными в MATLAB / Octave ...

...