gpt4 book ai didi

python - 如何在 python 中将文件中的二进制数据转换为可读的基二二进制文件?

转载 作者:太空宇宙 更新时间:2023-11-03 16:45:16 25 4
gpt4 key购买 nike

在我所在的类(class)中,我们被分配到一个简单的 mips 模拟器。我的程序应该处理的指令在二进制文件中给出。我不知道如何从该文件中获取任何可用的内容。这是我的代码:

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)。我得到的是我读过的字节字符串。所以我尝试用谷歌搜索来找出我能做些什么。所以我发现我可以使用 struct 将这些字节字符串转换为整数。以 (4294967295,) 等格式输出它们。

这仍然很烦人,因为我必须修剪它以使其成为可用的整数,但即使如此我仍然必须将其转换为位(基数为 2)。很高兴我可以读取带符号或无符号结构的字节,因为输入文件的一半输入是带符号的 32 位数字。

所有这一切似乎比从二进制文件中获取位要复杂得多。有没有更简单的方法来做到这一点?另外,您能否像向不太熟悉深奥的 python 代码并且对二进制数据不熟悉的人一样解释它?

我的总体目标是从我读取的每 4 个字节中直接获取 32 位。文件的开头是 mips 操作码的列表。所以我需要能够看到这些数字的特定部分,例如前 5 位,然后是接下来的 6 位,等等。文件末尾包含 32 位有符号整数值。文件的两半由中断操作码分隔。

感谢您给我的任何帮助。我无法通过搜索找到任何直接的答案,这让我发疯。如果您想查看二进制文件,请告诉我在哪里,我会将其发布。

最佳答案

请记住,普通的 Python 整数没有固定的位宽度:它们需要多大就多大。当您想要将有符号整数转换为位字符串时,这可能会很烦人。我建议您坚持当前正在做的事情:使用将 4 字节 block 转换为无符号整数

n = struct.unpack('>I', read_bytes)[0]

然后使用 format(n, '032b')'{0:032b}'.format(n)如果您想打印位,请将其转换为位字符串。

要访问或修改整数中的位,您不应该费心进行字符串转换,而应该使用 Python 的按位运算符 & , | , ^ , << , >> , ~ 。例如,(n >> 7) & 1给你 n 的第 7 位.

请参阅Unary arithmetic and bitwise operations有关这些运算符的详细信息,请参阅 Python 文档中的以下部分。

关于python - 如何在 python 中将文件中的二进制数据转换为可读的基二二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36371481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com