簡體   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