处理位流

3 投票
3 回答
905 浏览
提问于 2025-04-15 16:46

我有一个经过 base64 编码的比特流,想要处理它。在用 base64.b64decode 解码后,我得到了一个字节对象(顺便说一下,这是 Python 3 的内容),里面包含了解码后的代码。现在的问题是,我想对这个字节对象进行位运算,比如位移、按位与等,但因为它是一个字节序列,所以无法直接进行这些操作。

有没有办法对这个解码后的代码进行二进制操作呢?

3 个回答

0

如果你在用Python 2.x版本,可以试试Construct这个工具。它可以很优雅地解析数据,包括位数据

最近这个工具的更新不太活跃,所以我不太确定要让它在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
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(bits[:6],2)
25

然后再处理接下来的4个位

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

撰写回答