es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convirtiendo Hexadecimal a Binario de una lista.

Estoy tratando de abrir una lista con valores y sus datos hexadecimales y convertir cada línea a su valor binario correspondiente (con una pequeña máscara).

Por ejemplo, en mi archivo txt tengo:

DATA0 = 0x413e960d
DATA1 = 0x1c1c81c7
DATA2 = 0xa0000000
(32 Bits)

Quiero que el resultado sea:

000000000000000001000001001111101001011000001101
000000000000000000011100000111001000000111000111
000000000000000010100000000000000000000000000000
(48 Bits)

Quiero escribir esos valores en un nuevo archivo. En mi código, por alguna razón, se salta la conversión del primer valor. ¿Puede ayudarme a entender por qué?

Código:

with open(input, 'r') as r, open(output, 'w') as w:
    #lines = r.readlines()

    for line in r:
        # if not line.startswith('#'):
        if line.startswith('DATA'):
            #print(line)
            new_line = line.rsplit("=")[1]
            new_line.strip()
            w.writelines(new_line)
            w.writelines(new_line + str(bin(int(new_line, 16))[2:]).zfill(48))

También he intentado esta conversión: (última línea)

w.writelines(new_line + str('{:048b}'.format(int(new_line.strip(), 16))))
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, el código salta el primer valor porque la primera línea leída en el bucle es la línea del encabezado, es decir, la línea con los nombres de las variables. Para solucionar esto, puedes agregar una verificación para la línea del encabezado en tu declaración if para que sea saltado:

    if line.startswith('DATA'):
        new_line = line.rsplit("=")[1]
        new_line.strip()
        w.writelines(str(bin(int(new_line, 16))[2:]).zfill(48) + "\n")
    

    En cuanto a la conversión a binario, ya estás convirtiendo los valores hexadecimales a enteros usando int(new_line, 16). Para convertirlos a binario con una máscara de 48 bits, puedes usar el método format con una anchura de 48:

    str('{:048b}'.format(int(new_line.strip(), 16)))
    

    Ten en cuenta que también necesitas agregar un salto de línea al final de cada cadena binaria al escribir en el archivo de salida.

    Poniéndolo todo junto, el código actualizado es:

    with open(input, 'r') as r, open(output, 'w') as w:
        for line in r:
            if line.startswith('DATA'):
                new_line = line.rsplit("=")[1]
                new_line.strip()
                w.writelines(str(bin(int(new_line, 16))[2:]).zfill(48) + "\n")
    

    Esto debería escribir los valores binarios en un nuevo archivo con la máscara especificada.

Comments are closed.