如何将文件中的二进制数据转换为 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 文档中的以下部分。