2016-06-20 3 views
1

Что путь наиболее «вещий» переводаПреобразование шестнадцатеричных значений ASCII

'\xff\xab\x12' 

в

'ffab12' 

Я искал функций, которые могут сделать это, но все они хотят, чтобы перевести ASCII (так '\x40' - 'a'). Я хочу иметь шестнадцатеричные цифры в ASCII.

+0

Какие версию Python вы используете? –

+0

@JonClements 2.7.3 –

ответ

4

Там есть модуль, который называется binascii, который содержит функции для всего этого:

>>> import binascii 
>>> binascii.hexlify('\xff\xab\x12') 
'ffab12' 
>>> binascii.unhexlify('ffab12') 
'\xff\xab\x12' 
0
original = '\xff\xab\x12' 
result = original.replace('\\x', '') 
print result 

Это \x, потому что он сбежал. a.replace(b,c) просто заменяет все события bc в a.

Что вы хотите, это не ascii, потому что ascii переводит 0x41 в 'A'. Вы просто хотите его в шестнадцатеричной базе без \ x (или 0x, в некоторых случаях)

Редактировать !!
Извините, я думал, что \ x скрыт. Таким образом, \ х следуют 2 шестнадцатеричных цифр представляет один символ, а не 4 ..

print "\x41" 

Напечатает

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

res = "" 
for i in original: 
    res += hex(ord(i))[2:].zfill(2) 
print res 

Теперь давайте на эту линию:

hex(ord(i))[2:] 

ord(c) - возвращает числовое значение полукокса c
hex(i) - возвращает строковое шестнадцатеричное значение в Int i (например, если i=65 он вернется 0x41.
[2:] - вырезание префикса «0x» из шестнадцатеричной строки.
.zfill(2) - заполнение нулями

Таким образом, делая это с список понимание будет намного короче:

result = "".join([hex(ord(c))[2:].zfill(2) for c in original]) 
print result 
+1

Но моя оригинальная строка не сбежала. Это то, что я сказал: '' \ xff \ xab \ x12''. –

+0

О, так что если это ваша исходная строка (не экранированная), я отредактирую свой ответ :) –

+0

И я * хочу * хочу ASCII, потому что мне нужно отправить его как ASCII на сайт. –

Смежные вопросы