Конвертировать байтовую строку в Micropython - PullRequest
1 голос
/ 06 марта 2019

Как уже отмечалось здесь получение сообщения через сокет Micropython приводит к тому, что для работы остается строка байтов. У меня вопрос, как преобразовать эту строку байтов в другой пригодный для использования формат?

Я пробовал подобные:

data = s.recv(64)
new = hex(data)

, что приводит к таким ошибкам, как:

TypeError: невозможно преобразовать байты в int

А: data = s.recv (64) .hex () В результате:

AttributeError: у объекта 'bytes' нет атрибута 'hex'

Я довольно новичок в Python и Micro-python в целом. Насколько я могу судить, это не было дано прямого ответа на Micropython.

Если на этот вопрос был дан специальный ответ для Python3, я думаю, что стоит повторить его для Micropython, поскольку реализация может немного отличаться и, возможно, найти приемлемый «наилучший метод».

Ответы [ 3 ]

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

Непонятно, что именно вы пытаетесь сделать.

Способ преобразования байтов в строку заключается в вызове метода .decode.Это дает вам байты:

data = s.recv(64)

И это преобразует это в строку:

data = data.decode('utf-8')

Но вы пытаетесь вызвать hex(), который принимает одно целое число и возвращаетсоответствующее шестнадцатеричное значение.Это не имеет особого смысла в контексте вашего вопроса.

1 голос
/ 11 марта 2019

Вы пробовали import struct?

new = struct.unpack('=i', data)
1 голос
/ 08 марта 2019

Итак, у вас есть байтовый объект, и звучит так, будто вам нужна строка, содержащая шестнадцатеричное представление этих байтов.

Ответы на на этот вопрос описывают, как это сделать в стандартном Python, но после быстрой проверки с помощью онлайн-консоли MicroPython вы не можете просто позвонить .hex() на сам объект bytes, и у нас нет модулей binascii или codecs, поэтому ни один из этих методов не будет работать.

Однако с простым Python не сложно сделать то, что вы хотите:

>>> data = b'hello!'
>>> ''.join(['{:02x}'.format(b) for b in data])
'68656c6c6f'

Здесь мы используем понимание списка, чтобы получить каждый байт b по очереди от объекта байтов data. Затем мы форматируем это в двухсимвольную строку в шестнадцатеричном формате с начальным нулем, если необходимо, используя '{:02x}'.format(b). Выражение в квадратных скобках дает нам список этих двухсимвольных строк, поэтому, наконец, мы join их вместе разделяем пустой строкой.

Если вы хотите, чтобы между каждой двузначной группой был пробел, замените '' на ' '.

Я считаю this полезной отправной точкой для методов форматирования строк в Python. MicroPython поддерживает методы% -operator и str.format, но не форматированные строковые литералы.

...