2012-08-31 106 views

Respuesta

186

Tu puede transformar su cadena a un generador de int, aplique el formato hexadecimal para cada elemento y intercalarse con separador:

>>> s = "Hello world !!" 
>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 
+2

Genial, funciona en python3 mientras que la respuesta de Esthete no. –

+2

Tenga en cuenta que en python3, el concepto de imprimir un 'str' como hex no tiene sentido; querrá imprimir el objeto 'bytes' como hex (convertir' str' a 'bytes' llamando a' .encode() '). –

+5

De hecho, esto produce resultados no válidos en python3: '": ". Join (" {: 02x} ". Format (ord (c)) para c en 'løl')' returns ''6c: f8: 6c'' , mientras que '": ". join (" {: 02x} ". formato (c) para c en 'løl'.encode())' produce la representación correcta de utf-8 '' 6c: c3: b8: 6c'' . –

148
':'.join(x.encode('hex') for x in 'Hello World!') 
+1

¿Cómo hacer esto en python3? –

+5

@hyh: 'h = binascii.hexlify (b" ¡Hola mundo! ") Para obtener una cadena hexadecimal. b ":". join (h [i: i + 2] para i en rango (0, len (h), 2)) 'para insertar' ':' 'después de cada dos dígitos hexadecimales en él. – jfs

49

Para Python 2.x:

':'.join(x.encode('hex') for x in 'Hello World!') 

El código arriba, no funciona con Python 3.x, para 3.x, el siguiente código funcionará:

':'.join(hex(ord(x))[2:] for x in 'Hello World!') 
+1

también debe tenerse en cuenta, que el último TAMBIÉN funcionará con python2.x Y también funcionará para caracteres no ascii – raudi

+1

Pero también tenga en cuenta que este último no rellena los ceros iniciales: hex (ord ("\ x00")) [2:] es "0" y "\ x00" .encode ("hex") == "00" –

+2

¿Por qué decidió publicar esto como una nueva respuesta, meses después de que ambas soluciones habían sido ofrecidas por otros usuarios? ? Si el objetivo era aclarar la compatibilidad de la versión, tendría más sentido sugerir modificaciones a las respuestas existentes. – Air

18

Algunos complementos a Fedor respuesta Gogolev:

primer lugar, si la cadena contiene caracteres cuyo 'código ASCII' está por debajo de 10, que no se mostrará como se requiere. En ese caso, la forma correcta debe ser {:02x}:

>>> s = "Hello unicode \u0005 !!" 
>>> ":".join("{0:x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:75:6e:69:63:6f:64:65:20:5:20:21:21' 
             ^

>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:75:6e:69:63:6f:64:65:20:05:20:21:21' 
              ^^ 

En segundo lugar, si su "cadena" es en realidad una "cadena de bytes" - y ya que las cuestiones de diferencia en Python 3 - es posible que prefiera el siguiente :

>>> s = b"Hello bytes \x05 !!" 
>>> ":".join("{:02x}".format(c) for c in s) 
'48:65:6c:6c:6f:20:62:79:74:65:73:20:05:20:21:21' 

Tenga en cuenta que no es necesario para la conversión en el código anterior como a bytes objects is defined como "una secuencia inmutable de números enteros en el intervalo 0 < = x < 256".

18

Otra respuesta en dos líneas que algunos podrían encontrar más fácil de leer, y ayuda con saltos de línea depuración u otros caracteres extraños en una cadena:

for character in string: 
    print character, character.encode('hex') 
7

Usted puede utilizar hexdump 's

import hexdump 
hexdump.dump("Hello World", sep=":") 

(añada .lower() si necesita minúsculas). Esto funciona tanto para Python 2 & 3.

+0

También encontré un problema, si tiene problemas para instalar hexdump o cualquier otro paquete, por lo general, debido a la configuración del proxy, intente ejecutar pip con la opción proxy 'pip install -U hexdump --proxy http: //proxy.address: port' –

+0

En realidad cometí el error de usar 'sudo' con' pip', que arruinó 'pacman' ... –

7

¿Imprimir una cadena como bytes hexadecimales?

La respuesta aceptada da:

>>> s = "Hello world !!" 
>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 

La respuesta aceptada sólo funciona siempre y cuando usted se pega a ASCII. Si utiliza Unicode, por ejemplo:

>>> a_string = u"Привет мир!!" # "Prevyet mir, or "Hello World" in Russian. 
>>> ":".join("{:02x}".format(ord(c)) for c in a_string) 
'41f:440:438:432:435:442:20:43c:438:440:21:21' 

obtenemos un resultado pobre/inesperado - estos son los puntos de código que se combinan para hacer que los grafemas que vemos en Unicode, desde el consorcio Unicode - que representa a todos los idiomas sobre el mundo.Esto es no cómo realmente almacenamos esta información para que pueda ser interpretada por otras fuentes.

Para permitir que otra fuente utilice estos datos, generalmente necesitaríamos convertir a codificación utf-8, por ejemplo, para guardar esta cadena en bytes en el disco o para publicar en html. Así que tenemos que codifica para convertir los puntos de código a los unidades de código de UTF-8:

>>> ":".join("{:02x}".format(ord(c)) for c in a_string.encode('utf-8')) 
'd0:9f:d1:80:d0:b8:d0:b2:d0:b5:d1:82:20:d0:bc:d0:b8:d1:80:21:21' 

O quizás más elegante, sólo tiene que utilizar la orden interna format función:

>>> ":".join(format(ord(c), '02x') for c in a_string.encode('utf-8')) 
'd0:9f:d1:80:d0:b8:d0:b2:d0:b5:d1:82:20:d0:bc:d0:b8:d1:80:21:21' 
4

Utilizando el mapa y función lambda puede producir una lista de valores hexadecimales, que se puede imprimir (o utilizarse para otros fines)

>>> s = 'Hello 1 2 3 \x01\x02\x03 :)' 

>>> map(lambda c: hex(ord(c)), s) 
['0x48', '0x65', '0x6c', '0x6c', '0x6f', '0x20', '0x31', '0x20', '0x32', '0x20', '0x33', '0x20', '0x1', '0x2', '0x3', '0x20', '0x3a', '0x29'] 
1

Esto se puede hacer en siguientes maneras:

from __future__ import print_function 
str = "Hello World !!" 
for char in str: 
    mm = int(char.encode('hex'), 16) 
    print(hex(mm), sep=':', end=' ') 

La salida de esto será en hexadecimal como sigue:

0x48 0x65 0x6c 0x6c 0x6F 0x20 0x57 0x6F 0x72 0x6c 0x64 0x20 0x21 0x21

Cuestiones relacionadas