对字节执行按位操作

时间:2014-03-23 16:47:54

标签: python python-3.x bit-manipulation bitwise-and

我有两个对象ab,每个对象都包含一个字节对象中的单个字节。

我试图对此进行逐位操作以获得两个最重要的位(big-endian,所以在左侧)。

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'

有没有办法可以对这两个字节执行AND运算而不必考虑主机系统的字节顺序?

3 个答案:

答案 0 :(得分:9)

字节序列是一个不可变的整数序列(如数字元组)。不幸的是,没有在它们上定义按位运算 - 无论将它们放在字节序列上有多大意义。

因此,您必须单独使用手动路由并对字节运行操作。由于每个只有一个字节,但这样做非常简单。出于同样的原因,您也不需要关心字节序,因为只有在讨论多个字节时才适用。

所以,你可以这样做:

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

答案 1 :(得分:1)

更一般的答案

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

尽管IMO pyhon字节对象应该由Aready完成。...

答案 2 :(得分:1)

如果您有一个大字节字符串,使用它会更有效

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

谢谢@Eryk Sun