针对字节数据类型(>>,<<,|和&)的Python 3.6逐位操作引发错误:

时间:2019-11-15 07:23:37

标签: python python-3.6 bitwise-operators bit-shift

我是一个初学者,我正在尝试对“字节”数组中的元素执行按位操作

示例代码:

step1_result[i] = (bytes((seedrandom[i] >> 3)) | bytes((seedrandom[i] << 5)))
>>> TypeError: unsupported operand type(s) for >>: 'bytes' and 'bytes'

step1_resultseedrandom是具有“字节”类型元素的列表

有没有一种特定的方法可以对Python中的字节进行按位运算?

2 个答案:

答案 0 :(得分:3)

Python的按位运算符only operate on integers,因此您需要在执行按位运算之前将每个clear_output()转换为byte

int

请注意,如果您的字节位于实际的bytearray中,则不需要显式转换,因为在字节数组上建立索引会返回整数。

import sys
b1, b2 = [b'\x77', b'\x88']
int.from_bytes(b1, sys.byteorder) << int.from_bytes(b2, sys.byteorder)

同样,如果字节位于复合bytes对象中

ba = bytearray(b'\x77\x01')
ba[0] << ba[1]

答案 1 :(得分:1)

bytes是不可变的序列类型,而不是数字类型。您是指元素操作,例如bytes(map(lambda x: (x<<3) & 0xff, b'\xff\x03'))(列表理解形式:bytes([(x<<3) & 0xff for x in b'\xff\x03']))吗?请注意,字节数不能超过255,因此在将其收集到第二个字节对象之前,我需要将其掩码为8位。 Python没有用于单数字节的标准类型,就像它没有用于单数字符的标准类型一样。如果您从bytes对象读取单个元素,则该字节将转换为int