【问题标题】:How to get a list of all of the bits from a binary file in python如何从python中的二进制文件中获取所有位的列表
【发布时间】:2023-01-12 05:45:08
【问题描述】:

所以我有一个二进制文件 - 我需要列表中该文件中的所有位。我知道在打开文件时使用 Rb 函数会获取所有字节,如下所示:


 with open("binaryfile.bin", "rb") as f:
        bytes_read = f.read()
        for b in bytes_read:
            fetch(b)

但我想知道是否有一种方法可以获取此二进制文件中的所有特定位 - 并将其放入列表中。

我知道 python 只能通过字节来完成。我如何将它分成几部分? (我相信每个字节有 8 位,对吗?)

谢谢!

我尝试使用 rb 函数,但它只适用于字节,而不适用于位。

【问题讨论】:

  • 作为字符串-bin(int.from_bytes(bytes_read, "big"))[2:]。如果你想要一个整数列表,只需map(int, ...)
  • fetch(b) 应该做什么?
  • 是的,一个字节有 8 位。

标签: python


【解决方案1】:

您可以使用按位比较来隔离字节中的特定位。

想知道一个字节中的第 3 位是 1 还是 0?简单地用0b100做一个“与”运算。

>>> 4 & 0b100
4
>>> 3 & 0b100
0

【讨论】:

    【解决方案2】:

    您可以使用 bin() 函数来检索对应于一个字节的二进制数字。

    with open("binaryfile.bin", "rb") as f:
        bytes_read = f.read()
        for b in bytes_read:
            bits = bin(b)
            print(bits)
    

    请注意,这可能会打印大量二进制数字。如果您愿意,您可以将它们存储在列表中。

    另请注意,您可以删除由 bin() 产生的字符串的 0b 部分,因此您只处理这些位本身而不是 python 的位串表示。最后,您可以填充位,使它们按字节对齐(总共 8 位)。

    考虑以下解决方案,它将文件的字节转换为长度为 8 的位串,并将每个位串附加到列表中。

    bit_array = []
    with open("binaryfile.bin", "rb") as f:
        bytes_read = f.read()
        for b in bytes_read:
            bit_array.append(bin(b)[2:].rjust(8,'0')
    

    【讨论】:

      【解决方案3】:

      要从字面上获取文件每个字节的 0 或 1 列表很简单:

      [(n >> i) & 0x01 for n in bytes_read for i in range(7,-1,-1)]
      

      意识到这将是一个非常长长的名单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        相关资源
        最近更新 更多