Когда вы звоните value.encode()
, кодируется от str
до bytes
. Строка буквально состоит из \
, x
, F
, F
и так далее. Вы должны проанализировать str
самостоятельно.
Если вам не нужно проверять ввод (читай: вы пишете отдельный сценарий, который будет выполняться только вами), любой из этих хаков следует выполнить работу:
Удалить все экземпляры \x
, затем использовать binascii.unhexlify()
:
import crc8
import sys
import binascii
value = binascii.unhexlify(sys.argv[1].replace(r"\x", ""))
hash = crc8.crc8()
hash.update(value)
print(hash.hexdigest())
Разделить строку на экземпляры \x
, затем вызвать int
со вторым аргументом (base
), установленным в 16 для каждого из str
фрагментов, затем упаковать как bytes
:
import crc8
import sys
value = bytes(int(byte_str, 16) for byte_str in sys.argv[1].split(r"\x")[1:])
#value = bytes(map(lambda byte: int(byte, 16), sys.argv[1].split(r"\x")[1:]))
hash = crc8.crc8()
hash.update(value)
print(hash.hexdigest())
Или, если вам нравится жить на грани, Python выполните анализ за вас:
import crc8
import sys
exec(f'value = b"{sys.argv[1]}"') # YOLO, FIDLAR!
hash = crc8.crc8()
hash.update(value)
print(hash.hexdigest())
Если вы пишете что-то, что будет использоваться в производстве, вам действительно нужно тщательно проверить и проанализировать ваши входные данные.