2011-12-09 20 views
8

In python, come convertire una stringa ASCII esadecimale in una stringa binaria?In python, come convertire una stringa ascii hex in una stringa binaria interna raw?

Esempio:

01000001B8000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435362021222324

deve essere convertito in una stringa binaria. (0A bisogno di essere convertito in 1010, non bit ASCII 1000001 che è 65)

edit: Cambiato "binario non elaborato" in questione alla stringa "grezzo interno binario" per una migliore chiarezza.

+1

cosa intendi con _binary string_? è una stringa o un elenco di numeri interi a cui sei interessato? – moooeeeep

+0

Intendo rappresentazione binaria interna. Ho ricevuto la risposta come base64.b16decode –

risposta

13
import base64 
data = base64.b16decode("01000001B8000102030405") 
9

È questo ciò che stai cercando?

hex_string = '0A' 
'{0:b}'.format(int(hex_string, 16)) 
# returns '1010' 

o

''.join('{0:04b}'.format(int(c, 16)) for c in hex_string) 
+0

grazie. Ma la mia stringa è molto lunga. Non si inserisce in un numero intero. Il binario convertito andrà in qualche tipo di strutture di memoria continua come array o così. –

+0

@LunarMushrooms: funziona anche con la stringa di esempio. Ma ho aggiunto una versione speciale per te ... – eumiro

+2

Hai mai provato questo sulla tua stringa? E le grandi opere ('int's possono avere qualsiasi dimensione):' '100000000000000000000000110111000000000000000000100000010000000110000010000000101000001100000011100001000000010010000101000001011000011000000110100001110000011110001000000010001000100100001001100010100000101010001011000010111000110000001100100011010000110110001110000011101000111100001111100100000001000010010001000100011001001000010010100100110001001110010100000101001001010100010101100101100001011010010111000101111001100000011000100110010001100110011010000110101001101100010000000100001001000100010001100100100'' –

2

io non sono abbastanza sicuro che cosa si intende per una "stringa binaria". Se si intende una stringa che memorizza i dati binari, è possibile utilizzare the binascii module.

>>> data = "01000001B8000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435362021222324" 
>>> import binascii 
>>> binary = binascii.a2b_hex(data) 
>>> binary 
'\x01\x00\x00\x01\xb8\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./!"#$' 

Tuttavia, se si vuole veramente una stringa contenente un sacco di "0" s e "1" s è necessario fare un ulteriore passo avanti:

>>> "".join("{:08b}".format(ord(i)) for i in binary) 
'0000000100000000000000000000000110111000000000000000000100000010000000110000010000000101000001100000011100001000000010010000101000001011000011000000110100001110000011110001000000010001000100100001001100010100000101010001011000010111000110000001100100011010000110110001110000011101000111100001111100100000001000010010001000100011001001000010010100100110001001110010100000101001001010100010101100101100001011010010111000101111001100000011000100110010001100110011010000110101001101100010000000100001001000100010001100100100' 
7

Probabilmente è necessario il metodo .decode('hex') di stringhe (Python 2. X).

data= ("01000001B8000102030405060708090A0B0C0D0E0F10111213141516" 
    "1718191A1B1C1D1E1F202122232425262728292A2B" 
    "2C2D2E2F303132333435362021222324") 
data.decode('hex') 

In caso contrario, è possibile utilizzare base64.b16decode, ma si potrebbe desiderare di fornire un True per il secondo parametro (casefold) se l'input contiene minuscole cifre esadecimali da A a F.

1

Un modo semplice per fare ciò che stai cercando di ... convertire la tua stringa in un decimale esadecimale quindi utilizzare la funzione bin integrata per convertirla in binario.

dec_string = int(your_string, 16) #cast as int 

bin_string = bin(dec_string) #convert to binary 
Problemi correlati