Кодирование в виде 8-битного целого числа в текст в Python 3

#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'