#python #python-3.x #bluetooth #bluetooth-lowenergy
#python #python-3.x #bluetooth #bluetooth-низкое энергопотребление
Вопрос:
Я обновляю скрипт до Python 3 с Python 2 и у меня возникают проблемы со строкой ниже, он декодирует и отображает значение RSSI маяка BLE:
rssi = struct.unpack("b", packet[packetOffset -1])
Я нашел альтернативный метод для получения того же результата, который принимает 2 последних символа в строке трансляции и преобразует их в текст. Использование 8-битного кодировщика целых чисел со знаком.
Например, c3
становится -61
(https://cryptii.com/pipes/integer-encoder )
Однако я изо всех сил пытаюсь найти способ сделать это в python 3!
Как мне декодировать строку?
Любая помощь будет высоко оценена.
Комментарии:
1. Можете ли вы дать нам эту строку?
2. Вы заметили, что
int('c3', 16)
->195
и случайно195 - 256 = -61
?
Ответ №1:
Это то, что вы ищете?
a = bytes.fromhex('c3')
res = a[0] - 256 if a[0] > 127 else a[0]
bytes.fromhex
принимает строку и преобразует ее в byte
объект. Вы берете первый байт и делаете его неподписанным, проверяя, больше ли он 127.
Альтернативно:
res = int.from_bytes(bytes.fromhex('c3'), byteorder='big', signed=True)
Комментарии:
1. Да! Есть ли большая разница, если бы я вместо этого использовал ‘num = int (‘c3′, 16) — 256’?
2. Существует. Если вы попытаетесь,
int('0f', 16) - 256
вы получите-241
. Вам нужно проверить, является ли значение > 127 или нет. Использованиеint
— хорошая идея. Не уверен в последствиях. Мне нужно подумать об этом.3. @JacquesGaudin Почему a [0] должно быть меньше 127, чтобы сохранить его естественное десятичное представление. Можете ли вы подробнее рассказать об этом? Мне трудно это понять.
4. @Marcin Для операции требуется целочисленный кодировщик со знаком, но, насколько я помню
bytes.fromhex
, возвращает список байтов без знака. Тест, чтобы увидеть,a[0] > 127
просто ли значение смещается до целого числа со знаком.
Ответ №2:
Вы не показали точно, что находится в packet
, но вот предположение:
import struct
packet = b'x00xc3x00xff'
packetOffset = 2
rssi = struct.unpack("b", packet[packetOffset-1: packetOffset])[0]
print(repr(rssi)) # -> -61
# For a text string result, just do:
rssi = str(rssi)
print(repr(rssi)) # -> '-61'