example - serie hexadecimal a matriz de bytes en python
python bytearray to string (8)
Tengo una cadena hexagonal larga que representa una serie de valores de diferentes tipos. Deseo convertir esta cadena hexadecimal en una matriz de bytes para poder desplazar cada valor y convertirlo en su tipo de datos adecuado.
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 (muchas cadenas anexas), pero es bastante simple, solo utiliza Core Python.
Hay una función incorporada en bytearray que hace lo que usted desea.
bytearray.fromhex("de ad be ef 00")
Devuelve un bytearray y lee cadenas hexagonales con o sin separador de espacio.
Para la conversión posterior use binascii.b2a_hex (obj)
Supongamos que su cadena hexagonal es algo así como
>>> hex_string = "deadbeef"
Convierta a 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)
b''/xde/xad/xbe/xef''
>>> bytearray.fromhex(hex_string)
bytearray(b''/xde/xad/xbe/xef'')
Tenga en cuenta que bytes
es una versión inmutable bytearray
Suponiendo que tienes una cadena de bytes como tal
"/ x12 / x45 / x00 / xAB"
y usted sabe la cantidad de bytes y su tipo, también puede utilizar este enfoque
import struct
bytes = ''/x12/x45/x00/xAB''
val = struct.unpack(''<BBH'', bytes)
#val = (18, 69, 43776)
Como he especificado little endian (usando el carácter ''<'') al comienzo de la cadena de formato, la función devuelve el equivalente decimal.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B es igual a un byte (8 bit) sin signo
H es igual a dos bytes (16 bit) sin signo
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 que maneja
Un buen trazador de líneas es:
byte_list = map(ord, hex_string)
Esto iterará sobre cada char en la cadena y lo ejecutará a través de la función ord (). Solo probado en Python 2.6, no muy seguro de 3.0+.
-Josh
siempre que entendí correctamente, debería buscar binascii.unhexlify
import binascii
a=''45222e''
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
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