21

我有两个对象,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'

有什么方法可以对两个字节执行 AND 操作而不必考虑主机系统的字节顺序?

4

3 回答 3

24

字节序列是不可变的整数序列(如数字元组)。不幸的是,没有在它们上定义按位操作——不管将它们放在一个字节序列上会有多大意义。

因此,您将不得不走手动路线并单独对字节运行操作。因为每个人只有一个字节,所以这样做真的很简单。出于同样的原因,您也不需要关心字节顺序,因为这只适用于谈论多个字节时。

所以,你可以这样做:

>>> a, b = b'\x12', b'\x34'
>>> bytes([a[0] & b[0]])
b'\x10'
于 2014-03-23T16:59:17.530 回答
5

更一般的答案

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

虽然 IMO pyhon 字节对象应该这样做......

于 2019-11-28T14:50:59.610 回答
1

如果你有一个大字节字符串,使用起来会更有效率

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

谢谢,@Eryk Sun

于 2020-07-22T15:16:33.980 回答