使用比特流

时间:2009-12-07 23:13:26

标签: python python-3.x

我有一个base64编码的比特流,我想使用。用base64.b64decode解码后,我得到一个包含解码代码的字节对象(Py3k btw)。现在的问题是,我想用逐位操作来处理那个字节对象,例如移位,按位and等,但这是不可能的,因为它是一个字节序列。

有没有办法对解码的代码使用二进制运算?

3 个答案:

答案 0 :(得分:4)

尝试使用

list(bytestring)

例如

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

答案 1 :(得分: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

答案 2 :(得分:0)

如果您使用的是Python 2.x,则可以尝试使用Construct。它可以非常优雅地解析数据,包括bit data

最近它没有那么多活跃的开发,所以我不确定将它用于Python 3.x会涉及什么。但是对于2.x来说这很棒。