¿Cómo puedo realizar una conversión de una cadena binaria al valor hexadecimal correspondiente en Python?Conversión de Python de cadena binaria a hexadecimal
Tengo 0000 0100 1000 1101
y quiero obtener 048D
Estoy usando Python 2.6.
¿Cómo puedo realizar una conversión de una cadena binaria al valor hexadecimal correspondiente en Python?Conversión de Python de cadena binaria a hexadecimal
Tengo 0000 0100 1000 1101
y quiero obtener 048D
Estoy usando Python 2.6.
¡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.
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())
no necesita comprensión de la lista allí – SilentGhost
buen punto. No sé por qué siempre hago eso. –
bstr = '0000 0100 1000 1101'.replace(' ', '')
hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2))
@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 –
Brillante respuesta. Me sorprende que todavía no se haya votado/aceptado. – Andrei
¿Puede explicar cómo y por qué funciona esto? – Dennis
>>> 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'
Usar el módulo de cadena es tan 1990s ... –
¿cuál es el problema? Todavía está en Python 2.6 – ghostdog74
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(). –
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))
format(int(bits, 2), '0' + str(len(bits)/4) + 'x')
Necesita reemplazar espacios antes de la conversión. – Andrei
Sin usar concatenaciones desordenados y el relleno:
'{:0{width}x}'.format(int(temp,2)), width=4)
dará una representación hexadecimal con relleno conserva
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
¿Dónde está bin_value_to_hex_string? –
Uso del pitón
import binascii
binFile = open('somebinaryfile.exe','rb')
binaryData = binFile.read(8)
print binascii.hexlify(binaryData)
Esto no preserva 0s principales. –
@Ignacio, tienes razón, pero no creo que el OP haya preguntado sobre eso. En cualquier caso, ++ a tu respuesta para señalar eso. –
@Eli: el OP dijo específicamente que quería '048d', es decir, quiere cero inicial, NO quiere 0x –