2011-12-09 87 views
8

En python, ¿cómo convertir una cadena ASCII hexadecimal a cadena binaria?En python, ¿cómo convertir una cadena ascii hexadecimal a una cadena binaria interna sin procesar?

Ejemplo:

01000001B8000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435362021222324

necesita ser convertida a una cadena binaria. (0A necesitan convertirse a 1010, no a ASCII poco 1000001 que es 65)

edición: Se ha cambiado "binario" en cuestión de cadena "binario interno" para una mayor claridad.

+1

¿qué quiere decir con _binary string_? ¿es una cadena o una lista de enteros que te interesan? – moooeeeep

+0

Me refiero a la representación binaria interna. Obtuve la respuesta como base64.b16decode –

Respuesta

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

¿Es esto lo que estás buscando?

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

gracias. Pero mi cadena es muy larga. No cabe en un entero. El binario convertido irá a algún tipo de estructuras de memoria continua como una matriz más o menos. –

+0

@LunarMushrooms - esto también funciona con su cadena de ejemplo. Pero he agregado una versión especial para ti ... – eumiro

+2

¿Has intentado esto con tu cuerda? Funciona a la perfección ('int's pueden tener cualquier tamaño):' '100000000000000000000000110111000000000000000000100000010000000110000010000000101000001100000011100001000000010010000101000001011000011000000110100001110000011110001000000010001000100100001001100010100000101010001011000010111000110000001100100011010000110110001110000011101000111100001111100100000001000010010001000100011001001000010010100100110001001110010100000101001001010100010101100101100001011010010111000101111001100000011000100110010001100110011010000110101001101100010000000100001001000100010001100100100'' –

2

no estoy muy seguro de lo que entendemos por una "cadena binaria". Si se refiere a una cadena que almacena los datos binarios, puede usar 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 !"#$%&\'()*+,-./!"#$' 

Sin embargo, si realmente quieres una cadena que contiene una gran cantidad de "0" s y "1" s que tenga que ir un paso más allá:

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

Es probable que tenga el método .decode('hex') de cadenas (Python 2. X).

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

De lo contrario, puede utilizar base64.b16decode, pero es posible que desee suministrar un Verdadero al segundo parámetro (casefold) si su entrada contiene dígitos hexadecimales en minúsculas A a F.

1

Una manera fácil de hacer lo lo que intenta hacer ... convierta su cuerda en un decimal hexadecimal y luego use la función de bin incorporada para convertirla en binario.

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

bin_string = bin(dec_string) #convert to binary 
Cuestiones relacionadas