2016-05-21 1 views
0

Я работаю с модулем сокета python, играя с клиентом udp, который я написал. Мне не нравится, как он обрабатывает мои шестнадцатеричные литералы. пример:Python 2.7: как предотвратить автоматическое декодирование от шестнадцатеричного до строки

>>> querydns = '\xb9\x1b\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\x77\x77\x77\x06\x67\x6f\x6f\x67\x6c\x65\x03\x63\x6f\x6d\x00\x00\x01\x00\x01' 
>>> querydns 
'\xb9\x1b\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01' 

>>> replydata 
'\xb9\x1b\x81\x80\x00\x01\x00\x06\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\[email protected]\xe9\xb0j\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\[email protected]\xe9\xb0i\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\[email protected]\xe9\xb0\x93\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\[email protected]\xe9\xb0g\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\[email protected]\xe9\xb0h\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\xd4\x00\[email protected]\xe9\xb0c' 

Обратите внимание, как он автоматически декодирует часть шестнадцатеричного кода в символы? Я хочу иметь дело только с шестнадцатеричными значениями, без @ или www. Есть ли простой способ остановить это автоматическое декодирование?

+0

я поставил ответ, но чем больше я думаю об этом, я не понимаю, почему вы хотели бы изменить печатаемые символы, которые имеют смысл для нас людей, чтобы заставить их остаться в гекс не делает много смысла для меня –

+0

Короткий предел: «автоматическое декодирование», как вы его называете, происходит только при выводе строки в интерпретаторе. Или когда вы используете 'repr (querydns)'. И это фактически работает наоборот: он кодирует небезопасные символы в форму '\ xXX', поэтому представление может быть скопировано для повторного создания строки. – spectras

ответ

1

вы не можете на самом деле ... у вас есть несколько вариантов (вроде)

import binascii 
print binascii.hexlify(querydns) 

или подделать его (требуется больше усилий, чтобы сохранить ведущие нули) ...

print "".join("\\x%s"%(hex(ord(data_byte))[2:]) for data_byte in querydns) 

или комбинация, я думаю, будет работать

hexy = binascii.hexlify(querydns) 
print "".join("\\x%s"%hexy[i:i+2] for i in range(len(hexy)-1)) 
+0

@tijko thanks :) –

0

Вы можете использовать его как «сырую» строку, поставив перед строкой «r». Необработанная строка не обрабатывается питоном и берется как есть.

string = r"example string" 
+0

спасибо, это то, что я искал, мне просто нужен способ манипулировать отдельными шестнадцатеричными байтами. Благодаря! –

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

  • Нет связанных вопросов^_^