2009-12-07 65 views
3

我有一個base64編碼比特流,我想與之合作。在用base64.b64decode解碼之後,我得到一個包含解碼代碼的字節對象(Py3k btw)。現在的問題是,我想通過按位操作來處理該字節對象,比如移位,位清零and等,但這不可能,因爲它是一個字節序列。使用比特流

是否有任何方式使用二進制操作的解碼代碼?

+1

你可以將其轉換爲一個(長)整數,然後與 – Knio 2009-12-07 23:25:43

+0

@Knio工作:請張貼,作爲一個答案,而不是評論。 – 2009-12-08 01:34:23

回答

4

嘗試使用

list(bytestring) 

EG。

>>> bstring=b"Hello World" 
>>> list(bstring) 
[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] 
>>> 

如果你想要一個巨大的位域,而不是所有的八位字節

>>> from functools import reduce 
>>> reduce(lambda x,y:(x<<8)+y,list(b"Hello World")) 
87521618088882533792115812 
>>> bin(_) 
'0b100100001100101011011000110110001101111001000000101011101101111011100100110110001100100' 
>>> 

你沒有說你是如何計算的位,也許他們應該得到扭轉

>>> reduce(lambda x,y:(x<<8)+y,list(b"Hello World"[::-1])) 
121404708493354166158910792 
>>> bits=bin(_)[2:] 

並將字符串填充到偶數字節

>>> bits=bits.zfill(((len(bits)-1)//8+1)*8) 
>>> bits 
'0110010001101100011100100110111101010111001000000110111101101100011011000110010101001000' 

打開前6位爲一個int

>>> int(bits[:6],2) 
25 

,然後後面的4位

>>> int(bits[6:10],2) 
1 
+0

問題是我需要在每個字節之間工作。例如6位的字節1,然後是剩餘的2位和字節2的前2位等。 – poke 2009-12-07 23:23:28

+0

好吧,我加了如何製作一個很長的位域:) – 2009-12-07 23:29:09

+0

我之前也有類似的東西,我真的非常喜歡在兩者之間用一根弦,因爲這樣我就可以省掉很多資源。我希望在使用純二進制數據時使用更原生的方法。 – poke 2009-12-08 17:56:08

0

如果你使用的是Python 2.x中,你可以嘗試使用Construct。它可以做非常優雅的數據解析,包括bit data

它最近沒有太多積極的開發,所以我不確定在爲Python 3.x工作時會涉及什麼。但是對於2.x來說,這太棒了。

2

如果你需要讓你的bytes對象可變的,那麼你可以從它構建一個bytearray

mutable = bytearray(b"immutable") 

這將讓你通過正常作業修改單個字節

mutable[0] = mutable[1] = 32 

如果您需要做按位操作,然後我建議嘗試bitstring(抱歉推薦我自己的模塊)。它適用於Python 3,並允許您按位切片,移位,邏輯運算等等。

>>> s = bitstring.BitArray(bytes=b'your_bytes_object') 
>>> s.hex 
'0x796f75725f62797465735f6f626a656374' 
>>> ten_bits = s[5:15] 
>>> print(ten_bits, ten_bits.int) 
0b0010110111 183 
>>> print(ten_bits << 2) 
0b1011011100 
>>> print(s[0:6] & '0b110100') 
0b010100 
+0

謝謝,我會看看那個模塊:) – poke 2009-12-08 17:56:41