2010-01-15 29 views

Respuesta

46

¡Bienvenido a StackOverflow!

int dado base 2 y luego hex:

>>> int('010110', 2) 
22 
>>> hex(int('010110', 2)) 
'0x16' 
>>> 

>>> hex(int('0000010010001101', 2)) 
'0x48d' 

El doc de int:

int(x[, base]) -> integer 

Convert a string or number to an integer, if possible. A floating 

punto argumento se truncará hacia cero (esto no incluye una representación de cadena de un número de punto flotante!) Al convertir una cadena, use la base opcional. Es un error proporcionar una base al convertir un sin cadena. Si la base es cero, se adivina la base adecuada según el contenido de cadena . Si el argumento está fuera del rango entero, se devolverá un objeto largo .

El doc de hex:

hex(number) -> string 

Return the hexadecimal representation of an integer or long 

entero.

+4

Esto no preserva 0s principales. –

+0

@Ignacio, tienes razón, pero no creo que el OP haya preguntado sobre eso. En cualquier caso, ++ a tu respuesta para señalar eso. –

+3

@Eli: el OP dijo específicamente que quería '048d', es decir, quiere cero inicial, NO quiere 0x –

0

Suponiendo que están agrupados por 4 y separados por espacios en blanco. Esto preserva el principal 0.

b = '0000 0100 1000 1101' 
h = ''.join(hex(int(a, 2))[2:] for a in b.split()) 
+0

no necesita comprensión de la lista allí – SilentGhost

+0

buen punto. No sé por qué siempre hago eso. –

20
bstr = '0000 0100 1000 1101'.replace(' ', '') 
hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2)) 
+4

@SO realmente debería agregar colores por idioma. Aquí piensa que // es un comentario de C++ y pone en gris todo lo que sigue. // en Python no es un comentario, sino truncar la división entera –

+0

Brillante respuesta. Me sorprende que todavía no se haya votado/aceptado. – Andrei

+2

¿Puede explicar cómo y por qué funciona esto? – Dennis

-3
>>> import string 
>>> s="0000 0100 1000 1101" 
>>> ''.join([ "%x"%string.atoi(bin,2) for bin in s.split() ] ) 
'048d' 
>>> 

o

>>> s="0000 0100 1000 1101" 
>>> hex(string.atoi(s.replace(" ",""),2)) 
'0x48d' 
+2

Usar el módulo de cadena es tan 1990s ... –

+0

¿cuál es el problema? Todavía está en Python 2.6 – ghostdog74

+1

Todavía está en 2.X en beneficio de las personas que lo usaban en 1.X. string.atoi() está de acuerdo con los 2.6 documentos "" "En desuso desde la versión 2.0: utilice la función incorporada int()." "" y no está presente en 3.X. La implementación 2.X de string.atoi() llama a int(). No hay una buena razón para decirle a un recién llegado que string.atoi() existe incluso menos diciéndoles que lo use en lugar de decirles que usen int(). –

6

conversión de binario a hexadecimal sin ignorar los ceros iniciales:

Se puede usar el formato() incorporada funcionar de esta manera:

"{0:0>4X}".format(int("0000010010001101", 2)) 
+0

Esto funciona solo para números de 2 bytes, mientras que la respuesta de Ignacio funciona para cualquier longitud. – Andrei

+0

Aún necesita reemplazar espacios, si corresponde. – Andrei

0
format(int(bits, 2), '0' + str(len(bits)/4) + 'x') 
+0

Necesita reemplazar espacios antes de la conversión. – Andrei

3

Sin usar concatenaciones desordenados y el relleno:

'{:0{width}x}'.format(int(temp,2)), width=4) 

dará una representación hexadecimal con relleno conserva

0

Por alguna razón he tenido problemas con algunas de estas respuestas, me he ido y escribí un par de funciones de ayuda para mí, así que si tienes problemas como yo, dales una oportunidad.

def bin_string_to_bin_value(input): 
    highest_order = len(input) - 1 
    result = 0 
    for bit in input: 
     result = result + int(bit) * pow(2,highest_order) 
     highest_order = highest_order - 1 
    return bin(result) 

def hex_string_to_bin_string(input): 
    lookup = {"0" : "0000", "1" : "0001", "2" : "0010", "3" : "0011", "4" : "0100", "5" : "0101", "6" : "0110", "7" : "0111", "8" : "1000", "9" : "1001", "A" : "1010", "B" : "1011", "C" : "1100", "D" : "1101", "E" : "1110", "F" : "1111"} 
    result = "" 
    for byte in input: 
     result = result + lookup[byte] 
    return result 
def hex_string_to_hex_value(input): 
    bin_string = hex_string_to_bin_string(input) 
    bin_value = bin_string_to_bin_value(bin_string) 
    return hex(int(bin_value, 2)) 

Parecen funcionar bien.

print hex_string_to_hex_value("FF") 
print hex_string_to_hex_value("") 
print bin_string_to_bin_value("11010001101011") 

resultados en: Módulo de binascii

0xff 
0x1234567 
0b11010001101011 
+3

¿Dónde está bin_value_to_hex_string? –

7

Uso del pitón

import binascii 

binFile = open('somebinaryfile.exe','rb') 
binaryData = binFile.read(8) 

print binascii.hexlify(binaryData) 
Cuestiones relacionadas