问题描述
我有两个对象a
和b
,每个对象都包含一个字节对象中的一个字节。
我正在尝试对此进行按位运算以获得两个最重要的位(大端,因此向左)。
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 操作而不必考虑主机系统的字节序?
1楼
字节序列是不可变的整数序列(如数字元组)。 不幸的是,按位运算并没有在它们上定义——不管将它们放在一个字节序列上有多大意义。
因此,您必须走手动路线并单独对字节运行操作。 由于每个只有一个字节,因此这样做非常简单。 出于同样的原因,您也不需要关心字节序,因为这仅适用于讨论多个字节时。
所以,你可以这样做:
>>> a, b = b'\x12', b'\x34'
>>> bytes([a[0] & b[0]])
b'\x10'
2楼
更一般的答案
def andbytes(abytes, bbytes):
return bytes([a & b for a, b in zip(abytes[::-1], bbytes[::-1])][::-1])
虽然 IMO pyhon bytes 对象应该这样做......
3楼
如果你有一个大字节串,使用起来效率会更高
c = (int.from_bytes(a, 'big') & int.from_bytes(b, 'big')).to_bytes(max(len(a), len(b)), 'big')
谢谢,@Eryk Sun