Ho una lunga stringa esadecimale che rappresenta una serie di valori di diversi tipi. Vorrei convertire questa stringa esadecimale in una matrice di byte in modo da poter spostare ogni valore fuori e convertirlo nel suo tipo di dati corretto.
Ho una lunga stringa esadecimale che rappresenta una serie di valori di diversi tipi. Vorrei convertire questa stringa esadecimale in una matrice di byte in modo da poter spostare ogni valore fuori e convertirlo nel suo tipo di dati corretto.
Risposte:
Supponiamo che la tua stringa esadecimale sia simile
>>> 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')
Nota che bytes
è una versione immutabile di bytearray
.
string
-> bytes
, è `bytes.fromhex (" 000102030405060708090A0B0C0D0E0F ")` che produce b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
. Non pubblicare come risposta poiché la domanda richiede array di byte, ma pubblicare qui poiché è il primo hit che ho ottenuto durante la ricerca di byte in byte.
hex_string.decode("hex")
sta lavorando su Python 2.7. Ho appena provato il mio Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
.
bytes.fromhex
genera un errore quando la stringa di input ha un numero dispari di caratteri: bytes.fromhex("aab")
→ ValueError: non-hexadecimal number found in fromhex() arg at position 3
.
C'è una funzione integrata in bytearray che fa ciò che intendi.
bytearray.fromhex("de ad be ef 00")
Restituisce un bytearray e legge stringhe esadecimali con o senza separatore di spazi.
hex_string.decode("hex")
non lo è.
se ho capito bene, dovresti cercare binascii.unhexlify
import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
unhexlify
sia il modo più efficiente per andare qui, ma suggerirei che b = bytearray(s)
sarebbe meglio che usare ord
. Dato che Python ha un tipo incorporato solo per array di byte, sono sorpreso che nessuno lo stia usando
Supponendo che tu abbia una stringa di byte in questo modo
"\ X12 \ x45 \ x00 \ XAB"
e conosci la quantità di byte e il loro tipo puoi anche usare questo approccio
import struct
bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)
#val = (18, 69, 43776)
Come ho specificato little endian (usando il carattere '<') all'inizio della stringa di formato, la funzione ha restituito l'equivalente decimale.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B è uguale a un byte (8 bit) senza segno
H è uguale a due byte (16 bit) senza segno
Altri caratteri disponibili e dimensioni dei byte sono disponibili qui
I vantaggi sono ...
È possibile specificare più di un byte e l'endian dei valori
Svantaggi ..
Devi davvero conoscere il tipo e la lunghezza dei dati con cui hai a che fare
Dovresti essere in grado di creare una stringa contenente i dati binari usando qualcosa del tipo:
data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
bits += chr(int(data[x:x+2], 16))
Questo probabilmente non è il modo più veloce (molte stringhe vengono aggiunte), ma piuttosto semplice usando solo il core Python.
Puoi usare il modulo Codecs nella libreria standard di Python, ad es
import codecs
codecs.decode(hexstring, 'hex_codec')
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
Una buona fodera è:
byte_list = map(ord, hex_string)
Questo eseguirà l'iterazione su ogni carattere nella stringa e lo eseguirà attraverso la funzione ord (). Testato solo su Python 2.6, non troppo sicuro su 3.0+.
-Josh
byte_list = bytearray(hex_string)