对字节执行按位操作

Chl*_*ull 10 python bit-manipulation bitwise-and python-3.x

我有两个目的,a并且b,每个都包含在一个字节对象中的单个字节.

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

a = sock.recv(1)
b = b'\xc0'
c = a & b
Run Code Online (Sandbox Code Playgroud)

然而,它愤怒地吐TypeError在我的脸上.

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

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

pok*_*oke 10

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

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

所以,你可以这样做:

>>> a, b = b'\x12', b'\x34'
>>> bytes([a[0] & b[0]])
b'\x10'
Run Code Online (Sandbox Code Playgroud)

  • @aruisdante不,为什么?你已经说过了.实际上,我不同意这里的语言设计.我不明白为什么没有为字节对象提供按位操作... (5认同)

Jas*_*gan 5

更一般的答案

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

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