2009-08-06 3 views
9

Ho una stringa con caratteri binari e stringa e vorrei convertirla prima in binario, poi in esadecimale.Python: conversione stringa binaria/esadecimale?

La stringa è la seguente:

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

Come faccio a convertire questa stringa in Python in modo che l'output in formato esadecimale è simile a questo qui sotto?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F 
+5

si può approfondire la traduzione previsto? Mi sembra che la stringa di esempio e l'output esadecimale non siano la stessa cosa ... è <81> un singolo carattere non codificato esadecimamente codificato o è una rappresentazione testuale di questo? Sono confuso dalla stringa che contiene i caratteri binari (cosa intendi con questo) e che vuoi convertire in binario, quindi in esadecimale ... – Adriaan

+0

Fai questo: 'print (repr (your_string)))' e copia/incolla il risultato nella tua domanda. Diteci quale versione di Python e quale piattaforma. –

risposta

22

È possibile utilizzare ord e esadecimale come questo:

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

Oppure utilizzare la codifica incorporato:

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

La tua versione con 'hex' e' ord' non funziona in modo affidabile. Usa "% 2.2x" .__ mod__ invece di hex e puoi anche evitare il 'c [2: 4]'. Di conseguenza assomiglierebbe a: "" ".join (map ("% 2.2x ".__ mod__, map (ord, s)))'. La versione di codifica è ovviamente migliore. :-) –

+0

Ottimo, rispondi !! – Japanish

1

veloce soluzione si veda:

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) 

Risultati:

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' 

O

>>>import binascii 

>>> hex_str = binascii.hexlify(s) 

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