print example convert bytes array python bytearray

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