Python: преобразовать шестнадцатеричные значения, разделенные точками, в строку?

В этом посте: Печать строки в виде шестнадцатеричных байтов? я узнал, как для печати в виде строки в «массив» шестнадцатеричных байтов теперь мне нужно что-то наоборот:

Так, например, ввод будет: 73.69.67.6e.61.74.75.72.65, а вывод будет строкой.


person Eduard Florinescu    schedule 03.09.2012    source источник
comment
Результатом будет какая строка?   -  person Karl Knechtel    schedule 03.09.2012


Ответы (3)


Без 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    schedule 03.09.2012
comment
Я не знаю, что именно вы имеете в виду, но я добавил пример со строкой, содержащей немецкий умлаут (ö). - person sloth; 03.09.2012
comment
Я думал, вы говорите о UTF8, в котором больше байтов для символа. - person Eduard Florinescu; 03.09.2012
comment
@ thg435 мммм... это было слишком очевидно... не видеть леса за деревьями... :-) - 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 в начале строки для обозначения байтов.

Пример был здесь

person Serdalis    schedule 03.09.2012

Используйте разделение строк, чтобы получить список строк, затем база 16 для декодирования байтов.

>>> inp="73.69.67.6e.61.74.75.72.65"
>>> ''.join((chr(int(i,16)) for i in inp.split('.')))
'signature'
>>> 
person gimel    schedule 03.09.2012