Как я могу найти ключ с прямым порядком байтов в сообщении?

Я пытаюсь прочитать двоичное сообщение от ESP32 с помощью брокера; Я написал фитоновый скрипт, где подписываюсь на тему. сообщение, которое я фактически получаю:

b'\x00\x00\x00?'

это двоичное сообщение с прямым порядком байтов с плавающей запятой, но у меня нет ключа для его декодирования. Есть ли способ найти ключ декодирования на основе этих данных? Это мой код Python:

    import paho.mqtt.client as mqtt


def on_connect1(client1,  userdata1, flags1, rc1):
    
    client1.subscribe("ESP32DevKit123/mytopic")

def on_message1(client1, userdata1, msg1):
    print(msg1.topic+" "+ "TESTENZA: "+str(msg1.payload))

client1 = mqtt.Client()

client1.username_pw_set(username = "myuser",password = "mypassword")

client1.on_connect = on_connect1

client1.on_message = on_message1

client1.connect("linkclient", portnumber, 60)


def twosComplement_hex(hexval):
    bits = 16 # Number of bits in a hexadecimal number format
    on_message1 = int(hexval, bits)
    if on_message1 & (1 << (bits-1)):
    on_message1 -= 1 << bits
    return on_message1


client1.loop_forever()

У меня тоже выдает ошибку в строке on_message1 --= 1 << бит; ошибка говорит: Ожидаемый предполагаемый блок pylance. Любые решения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предоставленные вами данные: b'\x00\x00\x00?' — я предполагаю, что это 0000003f (пожалуйста, выведите шестнадцатеричный код с msg1.payload.hex()).

Я также предполагаю, что под «двоичным прямым порядком байтов с плавающей запятой» вы подразумеваете двоичный код с плавающей запятой с прямым порядком байтов (IEE754) — обратите внимание, что это не соответствует используемому вами алгоритму (двойной комплимент). Включение этого ввода в онлайн-инструмент указывает на то, что ожидаемый результат ("Плавающая - Big Endian (ABCD)") равен 8.82818e-44 (это стоит проверить с помощью этого инструмента; иногда кодировка может быть не такой, как вы думаете!).

Давайте распакуем это с помощью python (дополнительную информацию см. в документации структура):

>>> from struct import unpack
>>> unpack('>f', b'\x00\x00\x00\x3f')[0]
8.828180325246348e-44

Примечания:

  • [0] существует, потому что unpack возвращает массив (вы можете распаковать более одного элемента из ввода)
  • >f - > означает обратный порядок байтов, а f число с плавающей запятой (стандартный размер = 4 байта)

Причина, по которой ваш исходный код выдает ошибку «Ожидаемый предполагаемый блок», связана с отсутствием отступа в строке on_message1 -= 1 << bits (поскольку она следует за if, она должна иметь отступ). Алгоритм не имеет отношения к вашей задаче (но могут быть детали, которые я упускаю).

Другие вопросы по теме