Это не так уж сложно сделать с binascii.unhexlify
, единственная проблема, которая у вас есть, заключается в том, что вы хотите обнулить строку, если она не является четным числом кусочков (unhexlify
не примет длину 7 строка).
Итак, во-первых, вероятно, лучше всего сделать быструю функцию утилит, которая делает это, потому что эффективное ее выполнение не слишком очевидно, и вам нужно самодокументируемое имя:
def zeropad_even(s):
# Adding one, then stripping low bit leaves even values unchanged, and rounds
# up odd values to next even value
return s.zfill(len(s) + 1 & ~1)
Теперь все, что вам нужно сделать, это использовать это, чтобы исправить вашу строку перед ее освобождением:
>>> from binascii import unhexlify
>>> unhexlify(zeropad_even('A123456'))
'\n\x124V'
>>> _ == b'\x0A\x12\x34\x56'
True
Я включил этот последний тест, чтобы показать, что вы получили ожидаемый результат; repr
из str
пытается использовать печатный ASCII или короткие экранированные символы, где это возможно, поэтому только \x12
фактически заканчивается в repr
; \x0A'
становится \n
, \x34
- это 4
, а \x56
- это V
, но все это эквивалентные способы написания одних и тех же байтов.