J'ai une longue chaîne Hex qui représente une série de valeurs de types différents. Je souhaite convertir cette chaîne hexadécimale en un tableau d'octets afin de pouvoir décaler chaque valeur et de la convertir en son type de données approprié.
Supposons que votre chaîne hexagonale est quelque chose comme
>>> hex_string = "deadbeef"
>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"
>>> bytes.fromhex(hex_string) # Python ≥ 3
b'\xde\xad\xbe\xef'
>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')
Notez que bytes
est une version immuable de bytearray
.
Bytearray comporte une fonction intégrée qui fait ce que vous souhaitez.
bytearray.fromhex("de ad be ef 00")
Il retourne un bytearray et lit les chaînes hexadécimales avec ou sans séparateur d'espace.
à condition que j'ai bien compris, vous devriez chercher binascii.unhexlify
import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
En supposant que vous ayez une chaîne d'octets comme celle-ci
"\ x12\x45\x00\xAB"
et vous connaissez la quantité d'octets et leur type, vous pouvez également utiliser cette approche
import struct
bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)
#val = (18, 69, 43776)
Comme j'ai spécifié little endian (en utilisant le caractère '<') au début de la chaîne de formatage, la fonction a renvoyé l'équivalent décimal.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B est égal à un octet (8 bits) non signé
H est égal à deux octets (16 bits) non signés
Vous trouverez plus de caractères disponibles et la taille en octets ici
Les avantages sont ..
Vous pouvez spécifier plus d'un octet et le fin des valeurs
Inconvénients ..
Vous devez vraiment connaître le type et la longueur des données avec lesquelles vous traitez.
Vous devriez être capable de construire une chaîne contenant les données binaires en utilisant quelque chose comme:
data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
bits += chr(int(data[x:x+2], 16))
Ce n'est probablement pas le moyen le plus rapide (de nombreuses chaînes sont ajoutées), mais assez simple en utilisant uniquement le noyau Python.
Vous pouvez utiliser le module Codecs dans la Python Bibliothèque standard, c.-à-d.
import codecs
codecs.decode(hexstring, 'hex_codec')