J'ai une longue chaîne hexadécimale qui représente une série de valeurs de différents types. Je souhaite convertir cette chaîne hexadécimale en un tableau d'octets afin de pouvoir décaler chaque valeur et la convertir dans son type de données approprié.
150
Réponses:
Supposons que votre chaîne hexadécimale ressemble à quelque chose comme
Convertissez-le en chaîne (Python ≤ 2.7):
ou depuis Python 2.7 et Python 3.0:
Notez qu'il
bytes
s'agit d'une version immuable debytearray
.la source
string
->bytes
, c'est `bytes.fromhex (" 000102030405060708090A0B0C0D0E0F ")` qui donneb'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
. Ne pas poster comme réponse puisque la question demande un tableau d'octets, mais poster ici car c'est le premier hit que j'ai obtenu lors de la recherche de hext en octets.hex_string.decode("hex")
travaille sur Python 2.7. Je viens de tester sur monPython 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
.bytes.fromhex
génère une erreur lorsque la chaîne d'entrée a un nombre impair de caractères:bytes.fromhex("aab")
→ValueError: non-hexadecimal number found in fromhex() arg at position 3
.Il existe une fonction intégrée dans bytearray qui fait ce que vous voulez.
Il renvoie un bytearray et lit les chaînes hexadécimales avec ou sans séparateur d'espace.
la source
hex_string.decode("hex")
n'est pas le cas.à condition d'avoir bien compris, vous devriez chercher binascii.unhexlify
la source
unhexlify
c'est la façon la plus efficace de procéder ici, mais je dirais que ceb = bytearray(s)
serait mieux que d'utiliserord
. Comme Python a un type intégré juste pour les tableaux d'octets, je suis surpris que personne ne l'utiliseEn 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
Comme j'ai spécifié little endian (en utilisant le caractère «<») au début de la chaîne de format, 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
Plus de caractères disponibles et de tailles d'octets peuvent être trouvés ici
Les avantages sont ..
Vous pouvez spécifier plus d'un octet et l'extrémité des valeurs
Désavantages..
Vous devez vraiment connaître le type et la longueur des données avec lesquelles vous traitez
la source
Vous devriez pouvoir construire une chaîne contenant les données binaires en utilisant quelque chose comme:
Ce n'est probablement pas le moyen le plus rapide (beaucoup d'ajouts de chaînes), mais assez simple en utilisant uniquement le noyau Python.
la source
Vous pouvez utiliser le module Codecs dans la bibliothèque standard Python, c'est-à-dire
la source
la source
Une bonne doublure est:
Cela itérera sur chaque caractère de la chaîne et l'exécutera via la fonction ord (). Uniquement testé sur python 2.6, pas trop sûr de 3.0+.
-Josh
la source
byte_list = bytearray(hex_string)