我有一個base64編碼比特流,我想與之合作。在用base64.b64decode
解碼之後,我得到一個包含解碼代碼的字節對象(Py3k btw)。現在的問題是,我想通過按位操作來處理該字節對象,比如移位,位清零and
等,但這不可能,因爲它是一個字節序列。使用比特流
是否有任何方式使用二進制操作的解碼代碼?
我有一個base64編碼比特流,我想與之合作。在用base64.b64decode
解碼之後,我得到一個包含解碼代碼的字節對象(Py3k btw)。現在的問題是,我想通過按位操作來處理該字節對象,比如移位,位清零and
等,但這不可能,因爲它是一個字節序列。使用比特流
是否有任何方式使用二進制操作的解碼代碼?
嘗試使用
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
如果你需要讓你的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
謝謝,我會看看那個模塊:) – poke 2009-12-08 17:56:41
你可以將其轉換爲一個(長)整數,然後與 – Knio 2009-12-07 23:25:43
@Knio工作:請張貼,作爲一個答案,而不是評論。 – 2009-12-08 01:34:23