对字节进行位运算

29 投票
3 回答
40141 浏览
提问于 2025-04-17 23:32

我有两个对象,ab,它们各自包含一个字节的数据。

我想对这两个字节进行位运算,以获取最左边的两个有效位(大端模式,也就是在左边)。

a = sock.recv(1)
b = b'\xc0'
c = a & b

但是,它却给我抛出了一个TypeError的错误,让我很困惑。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'bytes' and 'bytes'

有没有什么办法可以在这两个字节上进行与运算,而不需要考虑主机系统的字节顺序呢?

3 个回答

4

如果你有一个很大的字节串,使用下面的方法会更有效率:

c = (int.from_bytes(a, 'big') & int.from_bytes(b, 'big')).to_bytes(max(len(a), len(b)), 'big')

谢谢,@Eryk Sun

6

更通用的回答

def andbytes(abytes, bbytes):
    return bytes([a & b for a, b in zip(abytes[::-1], bbytes[::-1])][::-1])

虽然我认为 Python 的字节对象应该已经可以做到这一点……

25

字节序列是一种不可变的整数序列(就像一组数字的元组)。不过,字节序列上并没有定义位运算——尽管在处理字节序列时,这样做是很有意义的。

因此,你需要手动处理,每个字节单独进行操作。因为你每次只处理一个字节,所以这样做其实非常简单。出于同样的原因,你也不需要担心字节序的问题,因为这只在处理多个字节时才需要考虑。

所以,你可以这样做:

>>> a, b = b'\x12', b'\x34'
>>> bytes([a[0] & b[0]])
b'\x10'

撰写回答