web-dev-qa-db-fra.com

chaîne hexadécimale dans un tableau d'octets dans python

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é.

124
Richard

Supposons que votre chaîne hexagonale est quelque chose comme

>>> hex_string = "deadbeef"

Convertissez-le en chaîne (Python ≤ 2.7):

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"

ou depuis Python 2.7 et Python 3.0:

>>> 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.

192
tzot

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.

133
kugg

à 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]
14
Bruce

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.

6
Hovo

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.

2
unwind

Vous pouvez utiliser le module Codecs dans la Python Bibliothèque standard, c.-à-d.

import codecs

codecs.decode(hexstring, 'hex_codec')
0
velsim