Преобразование Гекса в двоичный код из списка

#python #python-3.x #list #binary #type-conversion

#питон #python-3.x #Список #двоичный #преобразование типов

Вопрос:

Я пытаюсь открыть список со значениями и их шестнадцатеричными данными и преобразовать каждую строку только в двоичное значение (с небольшой маской).

Например, в моем txt-файле у меня есть:

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

Я хочу, чтобы результат был:

 000000000000000001000001001111101001011000001101 000000000000000000011100000111001000000111000111 000000000000000010100000000000000000000000000000 (48 Bits)  

Я хочу записать эти значения в новый файл, В моем коде по какой-то причине пропускается первое преобразование значений, можете ли вы помочь мне понять, почему?

Код:

 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))  

Я также пробовал это преобразование : (Последняя строка)

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

Комментарии:

1. Возможно, в первой строке перед «ДАННЫМИ» есть пробел — это могут быть «ДАННЫЕ».

Ответ №1:

Вы пишете свои шестнадцатеричные значения дважды с непоследовательными разрывами строк, но в целом я вижу, что все значения преобразуются. Попробуйте упростить свой код:

 with open("file.txt",'r') as r, open("output.txt",'w') as w:  for line in r:  if line.startswith('DATA'):  hex_val = line.rsplit("=")[1].strip()  w.writelines(f"{hex_val}:n{bin(int(hex_val, 16))[2:].zfill(48)}nn")  

Выход:

 0x413e960d: 000000000000000001000001001111101001011000001101  0x1c1c81c7: 000000000000000000011100000111001000000111000111  0xa0000000: 000000000000000010100000000000000000000000000000  

Комментарии:

1. Исправлена моя проблема, спасибо!

Ответ №2:

Ты забываешь раздеться "n" с line

 with open("input.txt",'r') as r, open("output.txt",'w') as w:  for line in r:  line_without_white_characters_including_next_line = ''.join(line.split()) # removes whitespaces and n  if line_without_white_characters_including_next_line.startswith('DATA'):  new_line = line_without_white_characters_including_next_line.split("=")[1]  w.writelines(str( bin(int(new_line, 16))[2:] ).zfill(48))  w.writelines("n") # need to write next line so values are not next to each other  

Мой вывод:

 000000000000000001000001001111101001011000001101 000000000000000000011100000111001000000111000111 000000000000000010100000000000000000000000000000