В этом посте: Печать строки в виде шестнадцатеричных байтов? я узнал, как для печати в виде строки в «массив» шестнадцатеричных байтов теперь мне нужно что-то наоборот:
Так, например, ввод будет: 73.69.67.6e.61.74.75.72.65
, а вывод будет строкой.
В этом посте: Печать строки в виде шестнадцатеричных байтов? я узнал, как для печати в виде строки в «массив» шестнадцатеричных байтов теперь мне нужно что-то наоборот:
Так, например, ввод будет: 73.69.67.6e.61.74.75.72.65
, а вывод будет строкой.
Без binascii
:
>>> a="73.69.67.6e.61.74.75.72.65"
>>> "".join(chr(int(e, 16)) for e in a.split('.'))
'signature'
>>>
или лучше:
>>> a="73.69.67.6e.61.74.75.72.65"
>>> "".join(e.decode('hex') for e in a.split('.'))
PS: работает с юникодом:
>>> a='.'.join(x.encode('hex') for x in 'Hellö Wörld!')
>>> a
'48.65.6c.6c.94.20.57.94.72.6c.64.21'
>>> print "".join(e.decode('hex') for e in a.split('.'))
Hellö Wörld!
>>>
ИЗМЕНИТЬ:
Здесь нет необходимости в выражении генератора (спасибо thg435):
a.replace('.', '').decode('hex')
ö
).
- person sloth; 03.09.2012
вы можете использовать встроенный модуль binascii
. Однако обратите внимание, что эта функция будет работать только с символами в кодировке ASCII.
binascii.unhexlify(hexstr)
Однако ваша входная строка должна быть без точек, но это довольно просто с помощью простого
string = string.replace('.','')
другим (возможно, более безопасным) методом будет использование base64 следующим образом:
import base64
encoded = base64.b16encode(b'data to be encoded')
print (encoded)
data = base64.b16decode(encoded)
print (data)
или в вашем примере:
data = base64.b16decode(b"7369676e6174757265", True)
print (data.decode("utf-8"))
Строка может быть очищена перед вводом в метод b16decode
. Обратите внимание, что я использую python 3.2, и вам может не обязательно понадобиться b
в начале строки для обозначения байтов.
Пример был здесь
Используйте разделение строк, чтобы получить список строк, затем база 16 для декодирования байтов.
>>> inp="73.69.67.6e.61.74.75.72.65"
>>> ''.join((chr(int(i,16)) for i in inp.split('.')))
'signature'
>>>