cadena hexadecimal a matriz de bytes en Python

Tengo una larga cadena hexagonal que representa una serie de valores de diferentes tipos. Deseo convertir esta cadena hexagonal en una matriz de bytes para poder cambiar cada valor y convertirlo en su tipo de datos adecuado.

Supongamos que su cadena hexadecimal es algo como

>>> hex_string = "deadbeef" 

Convertirlo en una cadena (Python ≤ 2.7):

 >>> hex_data = hex_string.decode("hex") >>> hex_data "\xde\xad\xbe\xef" 

o desde Python 2.7 y Python 3.0:

 >>> bytes.fromhex(hex_string) # Python ≥ 3 b'\xde\xad\xbe\xef' >>> bytearray.fromhex(hex_string) bytearray(b'\xde\xad\xbe\xef') 

Tenga en cuenta que los bytes son una versión inmutable de bytearray .

Hay una función incorporada en Bytearray que hace lo que pretendes.

 bytearray.fromhex("de ad be ef 00") 

Devuelve un bytearray y lee cadenas hexadecimales con o sin separador de espacio.

siempre que lo haya entendido correctamente, debe buscar binascii.unhexlify

 import binascii a='45222e' s=binascii.unhexlify(a) b=[ord(x) for x in s] 

Suponiendo que tiene una cadena de bytes como tal

“\ x12 \ x45 \ x00 \ xAB”

y conoce la cantidad de bytes y su tipo, también puede utilizar este enfoque

 import struct bytes = '\x12\x45\x00\xAB' val = struct.unpack(' 

Como especifiqué little endian (usando el carácter '<') al comienzo de la cadena de formato, la función devolvió el equivalente decimal.

0x12 = 18

0x45 = 69

0xAB00 = 43776

B es igual a un byte (8 bits) sin firmar

H es igual a dos bytes (16 bits) sin firmar

Más caracteres disponibles y tamaños de bytes se pueden encontrar aquí

Las ventajas son..

Puede especificar más de un byte y el endian de los valores

Desventajas ..

Realmente necesita saber el tipo y la longitud de los datos con los que trata

Debería poder construir una cadena que contenga los datos binarios usando algo como:

 data = "fef0babe" bits = "" for x in xrange(0, len(data), 2) bits += chr(int(data[x:x+2], 16)) 

Probablemente esta no sea la forma más rápida (muchos apéndices de cadenas), pero es bastante simple usando solo Python central.

 def hex2bin(s): hex_table = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111'] bits = '' for i in range(len(s)): bits += hex_table[int(s[i], base=16)] return bits 

Un buen trazador de líneas es:

 byte_list = map(ord, hex_string) 

Esto iterará sobre cada carácter en la cadena y lo ejecutará a través de la función ord (). Solo probado en Python 2.6, no estoy muy seguro acerca de 3.0+.

-Josh

Para la conversión inversa use binascii.b2a_hex (obj)