2010-07-15 8 views
8

Tengo un valor hexadecimal en una cadena comoConvertir de hexadecimal a binario sin perder más importantes 0 pitón

h = '00112233aabbccddee' 

Sé que puedo convertir esto en binario con:

h = bin(int(h, 16))[2:] 

Sin embargo, esta pierde los primeros 0's. ¿Hay alguna forma de hacer esta conversión sin perder los 0? O es la mejor manera de hacer esto solo para contar el número de los primeros 0 antes de la conversión y luego agregarlo después.

+1

¿Hay alguna razón en particular que necesita el 'de 0'? –

+1

Estoy usando el valor h más tarde como clave de un diccionario. Sin embargo, la clave tiene todos los 0 principales. – root

+0

¿Hay alguna razón de peso para usar una representación de cadena binaria del valor en lugar de un número entero para la clave del diccionario? –

Respuesta

15

No creo que haya una manera de mantener esos ceros a la izquierda por defecto.

Cada dígito hexadecimal se traduce en 4 dígitos binarios, por lo que la longitud de la nueva cadena debe ser exactamente 4 veces el tamaño del original.

h_size = len(h) * 4 

A continuación, puede utilizar .zfill rellenar ceros al tamaño que desee:

h = (bin(int(h, 16))[2:]).zfill(h_size) 
+0

Creo que esto me dio 3 0 extra por alguna razón – root

+0

Ah, no importa, funciona perfectamente. No estaba contando los 0 antes del primer número hexadecimal distinto de cero. Gracias. – root

+0

@root: no relacionado: no reutilice el nombre 'h' para diferentes cosas, por ejemplo, use el nombre' bits' para el resultado: 'bits = bin (int (h, 16)) [2:]. Zfill (len (h)) * 4) ' – jfs

2

Básicamente el mismo, pero el relleno a 4 bindigits cada hexdigit

''.join(bin(int(c, 16))[2:].zfill(4) for c in h) 
0

Un novato a Python como yo procedería como

datastring = 'HexInFormOfString' 

Relleno para dar cabida a los ceros precedentes si los hay, cuando Python convierte la cadena a hexadecimal.

datastrPadded = 'ffff' + datastring 

convertir el valor acolchada a binario.

databin = bin(int(datastrPadded,16)) 

Quite 2bits ('0b') que python agrega para indicar el binario + 16 bits rellenos.

databinCrop = databin[18:] 
0

Esto convierte una cadena hexadecimal en una cadena binaria. Como desea que la longitud dependa del original, esto puede ser lo que desee.

data = "" 
while len(h) > 0: 
    data = data + chr(int(h[0:2], 16)) 
    h = h[2:] 
print h 
6

Esto es realmente bastante fácil en Python, ya que no tiene ningún límite en el tamaño de los enteros. Simplemente anteponga un '1' a la cadena hexagonal, y elimine el '1' correspondiente de la salida.

>>> h = '00112233aabbccddee' 
>>> bin(int(h, 16))[2:] # old way 
'1000100100010001100111010101010111011110011001101110111101110' 
>>> bin(int('1'+h, 16))[3:] # new way 
'000000000001000100100010001100111010101010111011110011001101110111101110' 
+0

¡He estado buscando exactamente esto por una hora! –

0
hexa = '91278c4bfb3cbb95ffddc668d995bfe0' 
binary = bin(int(hexa, 16))[2:] 
print binary 
hexa_dec = hex(int(binary, 2))[2:] 
print hexa_dec 
Cuestiones relacionadas