Кодирование в 8-битное целое в текст в Python 3 - PullRequest
1 голос
/ 27 марта 2019

Я обновляю скрипт на 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!

Как мне декодироватьстрока?

Любая помощь будет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Это то, что вы ищете?

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 голос
/ 27 марта 2019

Вы не показали, что именно в packet, но вот предположение:

import struct


packet = b'\x00\xc3\x00\xff'
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'
...