Преобразование шестнадцатеричной строки в шестнадцатеричную байтовую строку. Проблема с символами ASCII

Мне необходимо получить байтовую строку в шестнадцатеричном виде b'\x15\x10...' для ее дальнейшей отправки в serial порт. Метод bytes.fromhex и unhexlify работают:

print(bytes.fromhex('151000149700'))
>>> b'\x15\x10\x00\x14\x97\x00'

Но не в случаях, когда появляются числа из кодировки ASCII:

print(bytes.fromhex('151000149729'))
>>> b'\x15\x10\x00\x14\x97)'

Как видно, вместо 29 я получаю ) Такой результат меня не устраивает. Как мне преобразовать '151000149729' к виду b'\x15\x10\x00\x14\x97\x29\xf7\x2C'?

Кусок кода, который я использую:

import crcmod.predefined
from binascii import unhexlify
str = '151000149729'
str2 = unhexlify(str)
crc16 = crcmod.predefined.Crc('modbus')
crc16.update(str2)
crc_16 = crc16.hexdigest()
crc16_1 = crc_16[:2]  #
crc16_2 = crc_16[2:]  # 
crc_16 = crc16_2 + crc16_1
crc_16 = str + crc_16
print(bytes.fromhex(crc_16))

Ответы (1 шт):

Автор решения: CrazyElf

Как часто бывает, это вопрос представления, а не хранения данных:

for b in bytes.fromhex('151000149729'):
    print(hex(b))

Вывод:

0x15
0x10
0x0
0x14
0x97
0x29

Последний байт у вас именно 0x29, просто при печати байтовой строки те символы, которые имеют какое-то осмысленное печатное изображение, печатаются в этом осмысленном изображении (в вашем случае это скобка), а вот те, которые не имеют символа отображения - те печатаются как 0xNN именно поэтому.

→ Ссылка