Я не могу конвертировать шестнадцатеричное в строку в Python
Итак, я сделал этот код (это просто часть, где он преобразует строку в шестнадцатеричное), и когда я пытаюсь расшифровать, я получаю следующее сообщение: Найдена не шестнадцатеричная цифра
Вот строка в шестнадцатеричный код:
def password (pslen):
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+}{:|?><,./;'\[]"
pw_length = pslen
mypw = ""
for i in range(pw_length):
next_index = random.randrange(len(alphabet))
mypw = mypw + alphabet[next_index]
print ("Password: ",mypw)
parolaBin = bin(int.from_bytes(mypw.encode(), 'big'))
parolaHex = hex(int(parolaBin, 2))
return parolaHex
А вот это шестнадцатеричный код
pw = binascii.unhexlify(pw)
Программа читает pw из файла.
Программа намного больше, но это та часть, которая застряла и не сработает.
Метод, который я использовал для преобразования строки в шестнадцатеричное, работал, но шестнадцатеричное в строку - нет.
Может кто-то помочь мне, пожалуйста?
1 ответ
Вы конвертируете целое число в гекс с помощью hex()
функция:
parolaHex = hex(int(parolaBin, 2))
Это включает в себя 0x
префикс, который не является шестнадцатеричным значением. Это то, что binascii.unhexlify()
жалуется на:
>>> import binascii
>>> binascii.unhexlify('0xff')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
binascii.Error: Non-hexadecimal digit found
>>> binascii.unhexlify('ff')
b'\xff'
Просто удалите этот префикс или не создавайте его в первую очередь, используя format(integer, 'x')
вместо:
parolaHex = format(int(parolaBin, 2), 'x')
Ваш метод генерации случайного пароля в шестнадцатеричном виде... слишком многословен. Вы можете просто генерировать случайные шестнадцатеричные цифры:
import string
return ''.join([random.choice(string.hexdigits) for _ in range(pwlen)])
и получить тот же результат с меньшим количеством работы. В любом случае, сначала нужно преобразовать целое число в двоичную запись, а затем преобразовать его обратно в целое число:
parolaBin = bin(int.from_bytes(mypw.encode(), 'big'))
parolaHex = hex(int(parolaBin, 2))
безусловно, ничего не делает, кроме как держать ваш процессор в тепле ночью. Вы могли бы пойти прямо в гекс:
parolaHex = format(int.from_bytes(mypw.encode(), 'big'), 'x')