utf8 print convertir bytes binascii binario python string hex ordinal-indicator

python - print - Imprimir una cadena como bytes hexadecimales?



python encode ascii (9)

Tengo esta cadena: Hello world !! y quiero imprimirlo usando Python como 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 .

hex() funciona solo para enteros.

¿Cómo puede hacerse esto?


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 solo funciona siempre que te apegues a ascii. Si usa 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, del consorcio Unicode, representen idiomas de todo el mundo. No es así como realmente almacenamos esta información, por lo que puede ser interpretada por otras fuentes.

Para permitir que otra fuente use 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. Entonces necesitamos esa codificación para convertir los puntos de código a las 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 tal vez de manera más elegante, solo use la función de format integrado:

>>> ":".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''


Algunos complementos a la respuesta de Fedor Gogolev:

Primero, si la cadena contiene caracteres cuyo ''código ASCII'' está por debajo de 10, no se mostrarán como se requiere. En ese caso, el formato correcto debería 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 dado que la diferencia es importante en Python 3, es posible que prefiera lo 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 hay necesidad de conversión en el código anterior ya que los objetos bytes se definen como "una secuencia inmutable de enteros en el rango 0 <= x <256" .


El uso de las funciones de mapa y lambda puede producir una lista de valores hexadecimales, que pueden imprimirse (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'']


Esto se puede hacer de las 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 estará en hexadecimal de la siguiente manera:

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


Otra respuesta en dos líneas que algunos podrían encontrar más fácil de leer, y que ayuda a depurar saltos de línea u otros caracteres impares en una cadena:

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


Para Python 2.x:

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

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

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


Puedes usar hexdump ''s

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

( .lower() si necesita minúsculas). Esto funciona tanto para Python 2 como para 3.


Tu puedes transformar tu cadena en un generador int, aplicar formato hexadecimal para cada elemento e intercalar 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


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