#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