2009-08-06 5 views
9

Ich habe eine Zeichenfolge, die sowohl binäre als auch Zeichenfolge-Zeichen hat, und ich möchte es zunächst in Binär, dann in Hex konvertieren.Python: Binär/Hex-String-Konvertierung?

Der String ist wie folgt:

<81>^Q<81>"^Q^@^[)^G ^Q^A^S^A^V^@<83>^Cd<80><99>}^@N^@^@^A^@^@^@^@^@^@^@j 

Wie gehe ich über diese Zeichenfolge in Python konvertieren, so dass die Ausgabe in Hex-Format auf den unten ähnlich ist?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F 
+5

können Sie sich auf die beabsichtigte Übersetzung näher erläutern? Es scheint mir, dass die Beispielzeichenfolge und die hexadezimale Ausgabe nicht dasselbe sind ... ist <81> ein einzelnes, nicht-druckbares hexadezimal codiertes Zeichen oder ist es eine Textdarstellung davon? Ich bin verwirrt durch die Zeichenfolge, die binäre Zeichen hält (was meinst du damit) und dass du es in Binär konvertieren willst, dann in Hex ... – Adriaan

+0

Tun Sie dies: 'print (repr (your_string)))' und kopieren/füge das Ergebnis in deine Frage ein. Sagen Sie uns, welche Version von Python und welche Plattform. –

Antwort

22

Sie können ord und hex wie folgt verwenden:

>>> s = 'some string' 
>>> hex_chars = map(hex,map(ord,s)) 
>>> print hex_chars 
['0x73', '0x6f', '0x6d', '0x65', '0x20', '0x73', '0x74', '0x72', '0x69', '0x6e', '0x67'] 
>>> hex_string = "".join(c[2:4] for c in hex_chars) 
>>> print hex_string 
736f6d6520737472696e67 
>>> 

Oder die builtin verwendet:

>>> s = 'some string' 
>>> print s.encode('hex_codec') 
736f6d6520737472696e67 
>>> 
+1

Ihre Version mit 'hex' und' ord' funktioniert nicht zuverlässig. Benutze "% 2.2x" .__ mod__ anstelle von hex und du kannst auch das 'c [2: 4]' vermeiden. Als Ergebnis würde es aussehen: "". .join (map ("% 2.2x" .__ mod__, map (ord, s))) '. Die Encoding-Version ist natürlich besser. :-) –

+0

Großartig, Antwort !! – Japanish

1

Schnellere Lösung finden Sie unter:

from timeit import Timer 

import os 
import binascii 

def testSpeed(statement, setup = 'pass'): 
    print '%s' % statement 
    print '%s' % Timer(statement, setup).timeit() 

setup = """ 
import os 

value = os.urandom(32) 
""" 

# winner 
statement = """ 
import binascii 

binascii.hexlify(value) 
""" 

testSpeed(statement, setup) 

# loser 
statement = """ 
import binascii 

value.encode('hex_codec') 
""" 

testSpeed(statement, setup) 

Ergebnisse:

import binascii 

binascii.hexlify(value) 

2.18547999816 

value.encode('hex_codec') 

2.91231595077 
7
>>> import binascii 

>>> s = '2F' 

>>> hex_str = binascii.b2a_hex(s) 

>>> hex_str 

>>> '3246' 

ODER

>>>import binascii 

>>> hex_str = binascii.hexlify(s) 

>>> hex_str 
>>> '3246' 
>>>