Преобразование дополнения Python 2 - PullRequest
0 голосов
/ 21 января 2019

У меня есть некоторые двоичные данные с моей метеостанции, которые мне нужно преобразовать в десятичную. Я должен объединить 2 байта, затем сдвиг вправо на 4. В настоящее время я делаю это следующим образом:

byte1 = 251
byte2 = 74
result = (byte1 * 256 + byte2) >> 4
print(result)

Это прекрасно работает, когда входные данные положительны, но когда они отрицательные, они имеют формат дополнения 2, и приведенный выше код не обрабатывает их должным образом. Результат 4020, но я хочу -76.

Как мне получить это для правильной обработки дополнения 2?

1 Ответ

0 голосов
/ 22 января 2019

Попробуйте:

byte1 = 251
byte2 = 74

byte_mask = ~0xFFFF

if (byte1>=128):
    result = ( ((byte1 << 8) + byte2) | byte_mask ) >> 4
else:
    result = ((byte1 << 8) + byte2) >> 4

Подробнее:

Мы все знаем, что такое дополнение 2 ... если самый левый бит равен 1, число является отрицательным, и мы должны выполнить дополнение 2, чтобы получить число. Это легкая часть. Сложность в том, что вы работаете в Python. Нумерация Python - это благословение и проклятие, потому что числа Python бесконечны (грубо говоря). Нам нужно как-то установить все самые левые биты бесконечного числа в 1, так что вы можете сделать:

byte_mask = ~0xFFFF

Теперь byte_mask - 1111 1111 1111 1111 1111 1111 ..... 0000 0000 0000 0000

Если ваш входящий байт1 больше 128 (и, следовательно, отрицательное число), мы просто ИЛИ ваш номер байта1, получая промежуточный результат:

1111 1111 1111 1111 ..... 1111 1011 0100 1010

Что явно намного ближе к тому, что мы хотим. Затем сдвиньте вправо 4. (Когда мы сдвигаемся вправо, самые левые 4 цифры будут заполнены, конечно же, 1):

1111 1111 1111 1111 ..... 1111 1111 1011 0100

Что в десятичном виде вы хотите: -76

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...