Cómo mostrar una matriz de bytes como valores hexadecimales

>>> struct.pack('2I',12, 30) b'\x0c\x00\x00\x00\x1e\x00\x00\x00' >>> struct.pack('2I',12, 31) b'\x0c\x00\x00\x00\x1f\x00\x00\x00' >>> struct.pack('2I',12, 32) b'\x0c\x00\x00\x00 \x00\x00\x00' ^in question >>> struct.pack('2I',12, 33) b'\x0c\x00\x00\x00!\x00\x00\x00' ^in question 

Me gustaría que todos los valores se mostraran como hexadecimales

¿Qué tal el suyo?

 >>> data = struct.pack('2I',12, 30) >>> [hex(ord(c)) for c in data] ['0xc', '0x0', '0x0', '0x0', '0x1e', '0x0', '0x0', '0x0'] 

La expresión [item for item in sequence] es una llamada comprensión de lista . Es básicamente una forma muy compacta de escribir un bucle for simple y crear una lista a partir del resultado.

La función incorporada ord() toma una cadena y la convierte en un entero que es su punto de código Unicode correspondiente (para los caracteres en el conjunto de caracteres ASCII que es igual a su valor en la tabla ASCII).

Su contraparte, chr() para cadenas de 8 unichr() o unichr() para objetos Unicode hace lo contrario.

El hex() incorporado entonces simplemente convierte los enteros en su representación hexadecimal.


Como lo señaló @TimPeters, en Python 3 necesitaría perder el ord() , porque la iteración sobre un objeto de bytes (ya) producirá enteros:

 Python 3.4.0a3 (default, Nov 8 2013, 18:33:56) >>> import struct >>> data = struct.pack('2I',12, 30) >>> type(data)  >>> type(data[1])  >>> >>> [hex(i) for i in data] ['0xc', '0x0', '0x0', '0x0', '0x1e', '0x0', '0x0', '0x0'] 

Tienes que reformatearlo tú mismo si quieres \x escapes por todas partes; p.ej,

 >>> import struct >>> r = struct.pack('2I',12, 33) >>> r b'\x0c\x00\x00\x00!\x00\x00\x00' >>> list(r) [12, 0, 0, 0, 33, 0, 0, 0] >>> print("".join("\\x%02x" % i for i in r)) \x0c\x00\x00\x00\x21\x00\x00\x00 

Prueba binascii.hexlify :

 >>> import binascii >>> import struct >>> binascii.hexlify(struct.pack('2I',12,30)) b'0c0000001e000000' >>> binascii.hexlify(struct.pack('2I',12,31)) b'0c0000001f000000' >>> binascii.hexlify(struct.pack('2I',12,32)) b'0c00000020000000' >>> binascii.hexlify(struct.pack('2I',12,33)) b'0c00000021000000' 

O si quieres espacios para que sea más legible:

 >>> ' '.join(format(n,'02X') for n in struct.pack('2I',12,33)) '0C 00 00 00 21 00 00 00' 

Python 3.6+, usando f-strings:

 >>> ' '.join(f'{n:02X}' for n in struct.pack('2I',12,33)) '0C 00 00 00 21 00 00 00' 

Hay una opción para convertir la matriz de bytes en una cadena hexadecimal con encode . Funciona para cualquier Python de Python 2.4:

 Python 2.7.12 (default, Oct 10 2016, 12:50:22) >>> import struct >>> struct.pack('2I',12, 30).encode('hex') '0c0000001e000000' >>> struct.pack('2I',12, 31).encode('hex') '0c0000001f000000' >>> struct.pack('2I',12, 32).encode('hex') '0c00000020000000' >>> struct.pack('2I',12, 33).encode('hex') '0c00000021000000'