繁体   English   中英

使用 python 从一个字节读取位

[英]Reading Bits from a byte with python

我有关于二进制文件结构的说明,我正在尝试构建一个解析器以从二进制文件中获取信息。 在遇到以下情况之前,我做得很好:

从 DWORD 大小 = 0 开始。您将通过获取 7 位包来重建大小:

  1. 获取一个字节。

  2. 将此字节的前 7 位添加到 Size。

  3. 检查该字节的第 7 位(最后一位)。 如果它打开,go 回到 1。处理下一个字节。

要恢复,如果 Size < 128 那么它将只占用 1 个字节,否则如果 Size < 16384 它只会占用 2 个字节,依此类推...

我感到困惑的是“从字节中获取位”和“检查字节的最后一位”的含义。 这是我从文件中读取字节的方式:


    from struct import *
    #..... some other blocks of code
    self.standard = {"DWORD":4,"WORD": 2,"BYTE": 1,"TEXT11": 1,"TEXT12": 2}
    st = st = self.standard
    size = 0
    data = unpack("b", f.read(st["BYTE"]))
    #how to get bits???
    if size < 128:
        #use st["TEXT11"]
    elif size < 16384:
        #use st["TEXT12"]

我感到困惑的是“从一个字节中获取位”是什么意思

您可以使用位操作来做到这一点。 例如,要获取字节的前 7 位(低 7 位),请使用

byte & 127

或者,等效地,

byte & 0x7f

或者

byte & 0b1111111

在您的情况下, byte将是元组data的第一个也是唯一的成员。

要获得最后一位,您需要屏蔽该位(使用& )并将其移位到 position (使用>> )-尽管在您的情况下,由于您只需要检查它是否已设置,因此移位不是绝对有必要。

也许混淆与 integer 数字的二进制表示有关,例如,如果我们有数字171 ,它相当于这个二进制配置(1 个字节):

val = 0b10101011 # (bit configuration)
print(val) # -> 171 (integer value)

现在您可以使用位掩码让这些位仅传递 1 个(大端表示法):

print(val & 0b00000001) # -> only the first bit pass and then it prints 1
print(val & 0b10000000) # -> only the latest bit pass and then it prints 128
print(val & 0b00000100) # -> it prints 0 because val does not have a 1 to the third position

然后,要检查第七位是否为 1,您可以执行以下操作:

print((val & 0b01000000) >> 6)
# val    = 0b10101011
#             ^
# mask   = 0b01000000
# result = 0b00000000 -> 0 (integer)
# shift  =    ^123456 -> 0b0

位移位( >>运算符)允许您获得位掩码的结果。

例如,如果你想要第二位:

print((val & 0b00000010) >> 1)
# val    = 0b10101011
#                  ^
# mask   = 0b00000010
# result = 0b00000010 -> 2 (integer)
# shift  =         ^1 -> 1b0 -> 1 (integer)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM