Интерпретировать str как последовательность шестнадцатеричных символов - PullRequest
1 голос
/ 04 октября 2019

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

packet = "004100ff"
checksum = 0
for el in packet:
    checksum ^= ord(el)
print (hex(checksum))

В настоящее время единственный способ получитьправильная контрольная сумма (0xbe) заключается в том, чтобы вручную переписать строку как package = '\ x00 \ x41 \ x00 \ xff', что не может быть выполнено автоматически.

Как я могу заставить Python интерпретировать строку, как если бы каждый2 символа были шестнадцатеричными байтами для выполнения контрольной суммы?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Как я могу заставить python интерпретировать строку, как если бы каждые 2 символа были шестнадцатеричными байтами для выполнения контрольной суммы?

Используйте bytes.fromhex() для интерпретации str как сериишестнадцатеричных цифр:

>>> packet = "004100ff"
>>> bytes.fromhex(packet)
b'\x00A\x00\xff'

Обратите внимание, что итерация над bytes даст вам int, поэтому больше не нужно ord():

>>> for el in bytes.fromhex(packet): print(el)  # or list(bytes.fromhex(packet))
... 
0
65
0
255
1 голос
/ 04 октября 2019

Если я правильно понимаю ваш вопрос. Это должно работать.

packet = "004100ff"
checksum = 0
bytes_string = [packet[i:i+2] for i in range(0, len(packet), 2)]
for byte_string in bytes_string:
    checksum ^= int(byte_string, 16)
print(hex(checksum))
...