Hexify результат дайджеста sha без использования hashlib

У меня есть дайджест данных в строковом формате, и я хотел бы его заколдовать.

Вот пример строки '\xf0z\xd8[\xfc\x7f'

Однако я не могу использовать hashlib, поскольку у меня нет исходных данных, из которых был создан хэш.

попытка .digesthex() в строке не сработает, поскольку объект str не имеет этого метода. Есть ли альтернатива?


person Zohar81    schedule 26.11.2018    source источник
comment
binascii.hexlify(s) возможно?   -  person jasonharper    schedule 27.11.2018


Ответы (1)


Для каждого символа в исходной строке используйте ord, чтобы получить числовое значение символа, а затем используйте операцию форматирования строки, чтобы выразить это числовое значение как строку, содержащую пару шестнадцатеричных цифр. Соберите эти двузначные строки в одну строку.

    mystring = '\xf0z\xd8[\xfc\x7f'
    result = ''
    for ch in mystring:
        number = ord(ch)
        hexdigits = '{:02x}'.format(number)
        result += hexdigits
    print result   

Вы можете сделать все это в одной строке, используя понимание списка, чтобы собрать пары строк шестнадцатеричных цифр в список, а затем использовать метод join с пустой строкой разделителя, чтобы склеить строки шестнадцатеричных цифр в одну строку.

    mystring = '\xf0z\xd8[\xfc\x7f'
    result   = ''.join([ '{:02x}'.format(ord(ch)) for ch in mystring ])
    print result

Или вместо понимания списка вы можете использовать map с lambda для построения списка пар шестнадцатеричных цифр.

    mystring = '\xf0z\xd8[\xfc\x7f'
    result   = ''.join(map(lambda ch: '{:02x}'.format(ord(ch)), mystring))
    print result

Версию map труднее читать, но она может работать немного быстрее.

person ottomeister    schedule 26.11.2018