2016-05-21 24 views
0

我正在使用python socket模塊,與我寫的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謝謝:) –

0

你可以使用它作爲'原始'字符串通過在字符串之前加'r'。 原始字符串不是由python處理的,而是照原樣處理。

string = r"example string" 
+0

謝謝你,這是我正在尋找,我只是需要一種方法來操縱個別十六進制字節。謝謝! –

相關問題