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: работи с unicode:

>>> 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!
>>>

РЕДАКТИРАНЕ:

Тук няма нужда от генераторен израз (thx to 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 mmmh... това беше твърде очевидно... не виждам дървото за дърветата... :-) - 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