Tengo una larga cadena hexadecimal que representa una serie de valores de diferentes tipos. Deseo convertir esta cadena hexadecimal en una matriz de bytes para poder cambiar cada valor y convertirlo en su tipo de datos adecuado.
150
Respuestas:
Supongamos que su cadena hexadecimal es algo así como
Conviértalo a una cadena (Python ≤ 2.7):
o desde Python 2.7 y Python 3.0:
Tenga en cuenta que
bytes
es una versión inmutable debytearray
.fuente
string
->bytes
objeto, es `bytes.fromhex (" 000102030405060708090A0B0C0D0E0F ")` que produceb'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
. No publica como respuesta ya que la pregunta solicita una matriz de bytes, pero publica aquí porque es el primer resultado que obtuve al buscar hext a bytes.hex_string.decode("hex")
está trabajando en Python 2.7. Acabo de probar en miPython 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
.bytes.fromhex
arroja un error cuando la cadena de entrada tiene un número impar de caracteres:bytes.fromhex("aab")
→ValueError: non-hexadecimal number found in fromhex() arg at position 3
.Hay una función incorporada en bytearray que hace lo que pretendes.
Devuelve un bytearray y lee cadenas hexadecimales con o sin separador de espacio.
fuente
hex_string.decode("hex")
que no.siempre que haya entendido correctamente, debe buscar binascii.unhexlify
fuente
unhexlify
es la forma más eficiente de ir aquí, pero sugeriría queb = bytearray(s)
sería mejor que usarord
. Como Python tiene un tipo incorporado sólo para matrices de bytes Me sorprende que nadie lo está utilizandoSuponiendo que tiene una cadena de bytes así
"\ x12 \ x45 \ x00 \ xAB"
y sabes la cantidad de bytes y su tipo, también puedes usar este enfoque
Como especifiqué little endian (usando el '<' char) 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 signo
H es igual a dos bytes (16 bits) sin signo
Puede encontrar más caracteres disponibles y tamaños de bytes 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
fuente
Debería poder construir una cadena que contenga los datos binarios usando algo como:
Probablemente esta no sea la forma más rápida (se añaden muchas cadenas), pero es bastante simple usando solo Python central.
fuente
Puede usar el módulo Codecs en la Biblioteca estándar de Python, es decir
fuente
fuente
Un buen trazador de líneas es:
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
fuente
byte_list = bytearray(hex_string)