В Python 2 Я создаю дайджест-значение с помощью hashlib.md5 из заданной строки и применяю некоторые logi c к выходной строке, например, функцию ord для строковых символов.
Я переношу код на Python3 и сталкиваются с двумя проблемами: 1-й: md5 ожидает байтов и выводит байты -> поэтому я даю ему строку в кодировке latin1 в соответствии с кодировкой по умолчанию Python2. Тип вывода отличается от Python2, поэтому я конвертирую байты в строку, чтобы я мог ввести строковую переменную с правильным значением в лог постобработки c, который применяет функцию ord к строковым символам.
Возникает вопрос: как получить требуемый вывод из байтов md5 с модификацией моего logi c постобработки чистым способом?
В настоящее время я конвертирую байты в строку грязным способом: str (bytes) [2: -1] и не знаю, как заменить '\' на '\' в:
Python2 .7:
import hashlib
s = "foo"
res = hashlib.md5(s).digest()
[ord(i) for i in res]
ВЫХОД:
[172, 189, 24, 219, 76, 194, 248, 92, 237, 239, 101, 79, 204, 196, 164, 216]
Обратите внимание, что я не могу заменить digest () на hexdigest (), так как я должен достичь вышеуказанного выходного значения.
Итак, В Python3:
import hashlib
s = "foo"
res = hashlib.md5(s).digest()
Я получаю:
TypeError: Unicode-objects must be encoded before hashing
Итак, я делаю:
res = hashlib.md5(s.encode('latin1')).digest()
и теперь получаю:
b'\xac\xbd\x18\xdbL\xc2\xf8\\\xed\xefeO\xcc\xc4\xa4\xd8'
Итак, я хочу заменить '\' на '\':
res.replace(r"\\", r"\")
, но получаю:
SyntaxError: EOL while scanning string literal
Я пытаюсь заменить обратную косую черту поэтому я могу получить правильное строковое значение, чтобы я мог применить правильное logi c, давая мне правильный результат:
[ord(i) for i in res]
[172, 189, 24, 219, 76, 194, 248, 92, 237, 239, 101, 79, 204, 196, 164, 216]