2010-10-03 9 views

Respuesta

6
>>> text = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'.rstrip('\0') 
>>> print "".join("%02x" % ord(c) for c in text) 
001bd47da4f3 

De acuerdo con el comentario de Martineau, aquí es la forma en Python 3:

>>> "".join(format(ord(c),"02x") for c in text) 
+0

'% 02x' sería mejor. –

+0

OK, lo cambié para usar% 02x –

+2

+1 porque es la mejor respuesta y no depende de la versión de Python. – martineau

-4

binascii.hexlify():

import binascii 

byte_string = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
print binascii.hexlify(byte_string.rstrip('\x00')) 

# -> 001bd47da4f3 

Ver @John Machin's answer.

+1

Stripping de la salida es correcto, creo. Él quiere eliminar ceros de cola en el resultado. –

+0

-1 Bizarre Baroque Byzantine Bassackwards Solución del mes –

+0

@IvovanderWijk: He actualizado la respuesta. ¿Te importaría borrar tu comentario desactualizado? binascii.hexlify() soportó la prueba del tiempo (funciona en Python 2/3 ("abc" .encode ('hex') funciona solo en Python 2 yb "abc" .hex() funciona solo en Python 3.5+). – jfs

5

Con python 2.x puede codificar una cadena para su representación hexadecimal. No funcionará con python3.x

>>> print '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'.encode("hex") 
'001bd47da4f300000000000000000000' 

No está del todo claro si tiene una cadena literal que contiene los escapes (así que básicamente r '\ x00 \ X1B' y así sucesivamente) o no. Además, no está claro por qué no esperas los ceros finales, pero se puede quitar los de antes de la codificación usando .rstrip ("\ x00")

+0

Buen punto acerca de los posibles escapes incrustados. También es extraño que todos estén usando la entrada de muestra, pero nadie ha comentado sobre el hecho de que está en mal estado (faltando '7d' y tiene '}' en ella) - aún todos dan salida deseada ... – martineau

+1

} no necesita un escape, pero escapó sería \ x7d. La cadena tiene mucho sentido, pero no todos los caracteres se escapan. –

+0

Está completamente claro desde la entrada y salida del OP que la entrada es '\ x00 \ x1b' etc. no r '\ x00 \ x1b' etc. –

4

Alternativa:

[Python 2.7] 
>>> data = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> import binascii 
>>> binascii.b2a_hex(data.rstrip('\x00')) 
'001bd47da4f3' 
>>> 

[Python 3.1.2] 
>>> data = b'\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> import binascii 
>>> binascii.b2a_hex(data.rstrip(b'\x00')) 
b'001bd47da4f3' 
>>> 
+0

'hexlify()' podría ser más legible. – jfs

+1

@ J.F. Sebastian: "hexlify" es tonto, ni siquiera es una palabra compacta (que sería "hexify"), mientras que unos pocos segundos de lectura de los documentos de Binascii revela que los nombres no tontos siguen un patrón ... b2a_hex significa "binario a ascii" , modo hexadecimal " –

+1

FWIW, ya sea' hexadecimal() 'un portmanteau" apropiado "o simplemente parece tonto para ti, ** es ** uno de los dos nombres para la misma función en el módulo' binascii' - entonces considere que obviamente otros también deben haber pensado que es un nombre más descriptivo o legible también. – martineau

2

Aquí hay otra respuesta que debe trabajar con todas las versiones de Python desde 3.x hasta 2.0 (versión mínima según pyqver). A pesar de eso, debido a que se basa en una simple tabla (no dict) búsqueda, también debería ser relativamente rápido.

Se requiere una pequeña configuración única, pero es muy simple y evita usar cualquiera de las muchas mejoras que se han agregado (o eliminado) a lo largo del camino en una búsqueda de independencia de versión.

numerals = "abcdef" 
hexadecimal = [i+j for i in numerals for j in numerals] 

text = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'  
print ''.join([hexadecimal[ord(c)] for c in text.rstrip('\0')]) 
# 001bd47da4f3 
Cuestiones relacionadas