如何将文件中的二进制数据转换为 python 中可读的二进制二进制文件?
How can i convert binary data from a file to readable base two binary in python?
在我所在的一个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,) 之类的格式输出它们。
这仍然很烦人,因为我必须 trim 使它成为一个可用的整数,然后我仍然必须将它转换为位(基数 2)。很高兴我可以读取带符号或无符号结构的字节,因为输入文件的一半输入是带符号的 32 位数字。
所有这一切似乎比从二进制文件中获取位要复杂得多。有没有更简单的方法来做到这一点?您还可以像对不熟悉深奥 python 代码并且不熟悉二进制数据的人那样解释它吗?
我的总体目标是从我读取的每 4 个字节中直接获取 32 位。文件的开头是一个 mips 操作码列表。所以我需要能够看到这些数字的特定部分,比如前 5 位,然后是下 6 位,等等。文件末尾包含 32 位有符号整数值。文件的两半由中断操作码分隔。
感谢您能给我的任何帮助。我无法通过搜索找到任何直接的答案,这让我发疯。如果你想看二进制文件,告诉我在哪里,我会 post 它。
这样您就可以访问文件中的每个位。
"".join(format(i, "08b") for i in byte_string)
例如:
>>> "".join(format(i, "08b") for i in b"\x23\x54a")
'001000110101010001100001'
请记住,正常的 Python 整数没有固定的位宽:它们根据需要的大小而定。当您想将有符号整数转换为位串时,这可能会很烦人。我建议您坚持目前正在做的事情:使用
将 4 字节的块转换为无符号整数
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 文档中的以下部分。
在我所在的一个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,) 之类的格式输出它们。
这仍然很烦人,因为我必须 trim 使它成为一个可用的整数,然后我仍然必须将它转换为位(基数 2)。很高兴我可以读取带符号或无符号结构的字节,因为输入文件的一半输入是带符号的 32 位数字。
所有这一切似乎比从二进制文件中获取位要复杂得多。有没有更简单的方法来做到这一点?您还可以像对不熟悉深奥 python 代码并且不熟悉二进制数据的人那样解释它吗?
我的总体目标是从我读取的每 4 个字节中直接获取 32 位。文件的开头是一个 mips 操作码列表。所以我需要能够看到这些数字的特定部分,比如前 5 位,然后是下 6 位,等等。文件末尾包含 32 位有符号整数值。文件的两半由中断操作码分隔。
感谢您能给我的任何帮助。我无法通过搜索找到任何直接的答案,这让我发疯。如果你想看二进制文件,告诉我在哪里,我会 post 它。
这样您就可以访问文件中的每个位。
"".join(format(i, "08b") for i in byte_string)
例如:
>>> "".join(format(i, "08b") for i in b"\x23\x54a")
'001000110101010001100001'
请记住,正常的 Python 整数没有固定的位宽:它们根据需要的大小而定。当您想将有符号整数转换为位串时,这可能会很烦人。我建议您坚持目前正在做的事情:使用
将 4 字节的块转换为无符号整数n = struct.unpack('>I', read_bytes)[0]
然后使用 format(n, '032b')
或 '{0:032b}'.format(n)
将其转换为位字符串(如果您想打印这些位)。
要访问或修改整数中的位,您不应该费心进行字符串转换,而应该使用 Python 的按位运算符,&
、|
, ^
, <<
, >>
, ~
。例如,(n >> 7) & 1
给出 n
.
有关这些运算符的详细信息,请参阅 Unary arithmetic and bitwise operations 和 Python 文档中的以下部分。