Проблема преобразования шестнадцатеричной строки в байты в Python - PullRequest
1 голос
/ 28 марта 2019

Я не могу преобразовать строку в байты.

Я пытаюсь преобразовать строку ('55 55 00 00') в шестнадцатеричном формате в байты и отправить эти байты через Pyserial, но я обнаружил, что у меня есть ошибка при преобразовании строки в байты. Мой код:

msg = '55 55 00 00'

bytes.fromhex(msg)

Я ожидал, что результат должен быть b'\0x55\0x55\0x00\0x00', почему результат
b'UU\x00\x00'.

Что такое UU?

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Вы правильно преобразовали строку msg в строку / объект bytes Python 3. Вы просто путаете со своей консоли печать. Объект bytes на самом деле представляет собой последовательность коротких целых чисел, хотя по возможности печатает его содержимое в виде символов.

Для проверки ниже:

In [49]: msg = '55 55 00 00'
In [50]: values = bytes.fromhex(msg)
In [51]: values
Out[51]: b'UU\x00\x00' # U == \0x55 == 85
In [52]: values[0]
Out[52]: 85
In [53]: [value for value in values]
Out[53]: [85, 85, 0, 0]

Примечание: здесь 85 == 0x55, который можно распечатать как U

Предположим, что если что-то невозможно распечатать как символ, это будет напечатано как экранированные шестнадцатеричные значения, проверьте ниже:

In [54]: bytes("aÄBèC", sys.getdefaultencoding())
Out[54]: b'a\xc3\x84B\xc3\xa8C'

Далее, чтобы печатать в желаемом формате, вы должны явно написать код для печати: -

"".join(["0x{:02x}".format(value) for value in values])
0 голосов
/ 28 марта 2019

0x55 совпадает с кодом ASCII для буквы U.Так что Python делает правильные вещи.Один из способов увидеть это:

b'\x55' == b'U'
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...