Преобразование шестнадцатеричной строки в шестнадцатеричную байтовую строку. Проблема с символами 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 шт):
Как часто бывает, это вопрос представления, а не хранения данных:
for b in bytes.fromhex('151000149729'):
print(hex(b))
Вывод:
0x15
0x10
0x0
0x14
0x97
0x29
Последний байт у вас именно 0x29, просто при печати байтовой строки те символы, которые имеют какое-то осмысленное печатное изображение, печатаются в этом осмысленном изображении (в вашем случае это скобка), а вот те, которые не имеют символа отображения - те печатаются как 0xNN именно поэтому.