2016-05-21 20 views
0

私が書いたudpクライアントを使って遊んでいるPythonソケットモジュールを使っています。私は16進リテラルをどのように処理するのが嫌いです。例:Python 2.7:16進数から文字列への自動デコードを防ぐ方法

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

16進数の一部を自動的に文字にデコードする方法に注意してください。私は16進値のみを扱いたい、@やwwwは扱っていません。この自動デコードを止める簡単な方法はありますか?

+0

私は答えを置くが、より多くの私はそれについて考える私はあなたが進は私に多くの意味を作るdoesntのように滞在するためにそれらを強制するために、私たちに人間を意味している印刷可能な文字を変更したいと思う理由を理解しない –

+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) 

か組み合わせ、私はあなたが文字列の前に「r」を置くことによって、「生の」文字列として使用することができます

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

@ tijkoありがとう:) –

0

を働くだろうと思います。 生の文字列は、Pythonで処理されずそのまま使用されます。

string = r"example string" 
+0

ありがとう、これは私が探していたものです、私はちょうど個々の16進バイトを操作する方法が必要でした。ありがとう! –

関連する問題