Я не могу конвертировать шестнадцатеричное в строку в 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')
Другие вопросы по тегам