Преобразовать строку байтов в "обычную" строку Python - PullRequest
0 голосов
/ 04 апреля 2020

Я генерирую argon2d ha sh и хотел сравнить его с хеш-строкой из моей базы данных.

Для хеширования я использую эту функцию:

    import argon2

    argon2Hasher = argon2.hash_password_raw(b"password", b"TESTTESTTESTTEST" ,time_cost=16, memory_cost=512, parallelism=1, hash_len=16,     type=argon2.Type.D) #argon2.low_level.Type.D)
    print(argon2Hasher)

И мой вывод :

b'\x0c\xd1\xe3\xf0\x0f\x03<\xa0\xa99\xee\x85I\xc8\xcb\xb0'

Я попытался использовать argon2Hasher.decode(encoding="ascii"), что привело к: UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 1: ordinal not in range(128) И я также попробовал ту же команду с encoding="utf-8", но это привело к UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 1: invalid continuation byte

Как можно Я преобразовываю это в открытый текст (нормальная строка)?

Я использую Python 3.6.

1 Ответ

0 голосов
/ 06 апреля 2020

Хотя невозможно точно определить , какую кодировку использовать, есть некоторая кодировка, которая не имеет недопустимых значений , например, latin1, пробуя это на вашем компьютере. данные дают это:

s = b'\x0c\xd1\xe3\xf0\x0f\x03<\xa0\xa99\xee\x85I\xc8\xcb\xb0'
repr(s.decode('latin1'))
# "'\\x0cÑãð\\x0f\\x03<\\xa0©9î\\x85IÈË°'"

Документация пакета codecs предоставляет вам полный список того, что вы можете указать для кодирования.


Тем не менее, я думаю, что вы задаете себе неправильный вопрос. Если показанный вами bytes предназначен для обозначения га sh, то преобразование в str на самом деле нежелательно, поскольку, поскольку вы экспериментируете сами, это также должно включать кодировку для того, чтобы это было «интерпретировано». Напротив, bytes - это bytes, и дополнительная кодировка не требуется. По этой же причине hashlib работает в основном с bytes.

...