В классе, в котором я находится, мы назначаем простой симулятор mips. Инструкции, которые моя программа должна обрабатывать, приводятся в двоичном файле. Я понятия не имею, как извлечь из этого файла что-нибудь полезное. Вот мой код:Как я могу преобразовать двоичные данные из файла в читаемую базу двоичных двоичных файлов в python?
import struct
import argparse
'''open a parser to get command line arguments '''
parser = argparse.ArgumentParser(description='Mips instruction simulator')
'''add two required arguments for the input file and the output file'''
parser.add_argument('-i', action="store", dest='infile_name', help="-i INPUT_FILE", required=True)
parser.add_argument('-o', action="store", dest='outfile_name', help="-o OUTPUT_FILE_NAME", required=True)
'''get the passed arguments'''
args = parser.parse_args()
class Disassembler:
'''Disassembler for mips code'''
instruction_buffer = None
instructions_read = 0
def __init__(self, filename):
bin_file = None
try:
bin_file = open(filename, 'rb')
except:
print("Input file: ", filename, " could not be opened. Check the name, permissions, or path")
quit()
while True:
read_bytes = bin_file.read(4)
if (read_bytes == b''):
break
int_var = struct.unpack('>I', read_bytes)
print(int_var)
bin_file.close()
disembler = Disassembler(args.infile_name)
Итак, сначала я только что напечатал 4 байта, которые я прочитал, чтобы увидеть, что было возвращено. Я надеялся увидеть простые биты (только 1 и 0). То, что я получил, это байтовые строки из того, что я прочитал. Поэтому я попробовал поиск в Google, чтобы узнать, что я могу с этим поделать. Поэтому я нашел, что могу использовать struct для преобразования этих строк байтов в целые числа. Это выводит их в формате (4294967295,).
Это все еще раздражает, потому что мне нужно обрезать это, чтобы сделать его полезным целое, а затем еще нужно преобразовать его в биты (база 2). Приятно, что я могу читать байты со структурой как подписанные или без знака, потому что половина входного файла вводится 32-разрядными номерами.
Все это кажется более сложным, чем нужно, чтобы просто извлечь биты из двоичного файла. Есть ли более простой способ сделать это? Также вы можете объяснить это так, как если бы вы были знакомы с эзотерическим кодом на языке python и новичок в двоичных данных?
Моя общая цель - получить прямые 32 бита из каждых 4 байтов, которые я прочитал. Начало файла - это список кодов операций mips. Поэтому мне нужно уметь видеть определенные части этих чисел, например, первые 5 бит, затем следующие 6 или так далее. Конец файла содержит 32-битные знаковые значения со знаком. Две половины файлов разделяются кодом операции перерыва.
Благодарим за помощь, которую вы можете мне дать. Это сводит меня с ума, что я не могу найти прямых ответов при поиске. Если вы хотите увидеть двоичный файл, скажите мне, где и я опубликую его.
Вы просто хотите [визуализировать] (https://stackoverflow.com/questions/18111488/convert-integer-to-binary-in-python-and-compare-the-bits) бит значения, или вы хотите, чтобы они были в [integer] (https: // stackoverflow.com/questions/30971079/how-do-i-convert-an-integer-to-a-list-of-bits-in-python) для дальнейшей манипуляции? – Reti43
Мне нужно прочитать их как биты, которые я думаю. Потому что мне нужна определенная длина из каждого 32-битного значения. Например, мне нужно увидеть, что такое первые 6 бит, затем следующие 5 и т. Д. Поэтому мне нужны значения в прямых битах, которые я думаю. Если нет лучшего способа сделать это, но, насколько мне известно, это единственный способ, которым я знаю, как работать с данными. – Jacob
Есть несколько способов сделать это. Посмотрите на ссылки выше в моем комментарии. Я бы посоветовал вам также указать в вопросе, какова ваша цель, иначе мы не сможем предложить лучшие подходы к решению, которое вы пытаетесь реализовать в вопросе. – Reti43