我有 8 個位元組的numpy.frombuffer()陣列形式的資料。我需要將第 10-19 位放入變數,將第 20-29 位放入變數。如何使用 Python 提取跨位元組的位?我讀過關于位移的文章,但我不清楚這是否是這樣做的方法。
uj5u.com熱心網友回復:
根據您的資料型別,您可能需要稍微修改這個 numpy 解決方案:
a = np.frombuffer(b'\x01\x02\x03\x04\x05\x06\x07\x08', dtype=np.uint8)
#array([1, 2, 3, 4, 5, 6, 7, 8], dtype=uint8)
解包位:
first = np.unpackbits(a)[10:20]
#array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0], dtype=uint8)
如果您需要重新打包這些位:
first_packed = np.packbits(first)
array([8, 0], dtype=uint8)
請注意,python 是基于 0 的索引,如果您想要第 10-19 個元素,請將上述索引調整為np.unpackbits(a)[9:19].
其他情況類似:
second = np.unpackbits(a)[20:30]
#array([0, 0, 1, 1, 0, 0, 0, 0, 0, 1], dtype=uint8)
uj5u.com熱心網友回復:
通過索引正確的位元組來單獨獲取每個位,然后屏蔽正確的位。然后,您可以通過移位和相加來從位構建新數字。
data = b'abcdefgh' #8 bytes of data
def bit_slice(data, start, stop):
out = 0
for i in range(start, stop):
byte_n = i//8
byte_bit = i%8
byte_mask = 1<<byte_bit
bit = bool(data[byte_n] & byte_mask)
out = out*2 bit #multiply by 2 is equivalent to shift. Then add the new bit
return out
回復:評論
每次我們想為我們的數字添加一個新位時,如下所示:
10110
101101
我們必須將前五位移位,然后根據下一位的值加 1 或 0。向左移動每個數字高一位,這在二進制中意味著乘以 2。在十進制中,將一個數字移一位意味著乘以 10。當將新位添加到我們的數字時,我們正在累加我只是乘以 2使用右移運算子只是為了表明它是另一種選擇。創建位元組掩碼時,我確實使用了右移運算子 ( <<)。它通過將 1 移動幾個位置來作業,所以我最終得到一個在正確位置有一個 1 的位元組,當我用有問題的位元組“和”它時,我只得到我想要索引的單個位:
1<<3 = 00001000
1<<5 = 00100000
1<<0 = 00000001
1<<7 = 10000000
然后應用掩碼以獲得我們想要的位:
10011011 #一個位元組的資料
00100000 #32位的位掩碼
_________&
00 0 00000
#32位的位為0
10011011 #一個位元組的資料
00010000 #16位掩碼
_________&
000 1 0000
#16位位為1
應用掩碼后,如果所選位為 0,則整個數字將始終為 0。如果所選位為 1,則數字將始終大于 0。呼叫bool該結果等效于:
if data[byte_n] & byte_mask > 0:
bit = 1
else:
bit = 0
... because a boolean interpreted as an integer is simply a 1 or a 0.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317005.html
