Python 中不支持按位异或的操作数类型
Unsupported operand types for bitwise exclusive OR in Python
我正在使用一个生成循环冗余校验值的函数。在通过串行发送数据包之前,我似乎遇到了一些问题 Python 无法确定值的十六进制表示和 ascii 表示之间的区别。我发送以下数据:
('+', ' ', 'N', '\x00', '\x08')
到下面的函数
# Computes CRC checksum using CRC-32 polynomial
def crc_stm32(self,data):
crc = 0xFFFFFFFF
for d in data:
crc ^= d
for i in range(32):
if crc & 0x80000000:
crc = (crc << 1) ^ 0x04C11DB7 #Polynomial used in STM32
else:
crc = (crc << 1)
crc = (crc & 0xFFFFFFFF)
return crc
现在通过此函数的 '+' 字符的实际值是(正如人们可能期望的那样)0x2B,但是当 Python 到达行
时
crc ^= d
我遇到以下错误
unsupported operand type(s) for ^=: 'long' and 'str'
我试过将值转换为 chr()、hex()、int()、long() 等,但都无济于事。似乎 Python 正在将“+”值解释为字符或字符串。
根据 juanpa 的评论,对代码进行以下修改可以正确处理数据。
# Computes CRC checksum using CRC-32 polynomial
def crc_stm32(self,data):
crc = 0xFFFFFFFF
for d in map(ord,data):
crc ^= d
for i in range(32):
if crc & 0x80000000:
crc = (crc << 1) ^ 0x04C11DB7 #Polynomial used in STM32
else:
crc = (crc << 1)
crc = (crc & 0xFFFFFFFF)
print crc
return crc
我正在使用一个生成循环冗余校验值的函数。在通过串行发送数据包之前,我似乎遇到了一些问题 Python 无法确定值的十六进制表示和 ascii 表示之间的区别。我发送以下数据:
('+', ' ', 'N', '\x00', '\x08')
到下面的函数
# Computes CRC checksum using CRC-32 polynomial
def crc_stm32(self,data):
crc = 0xFFFFFFFF
for d in data:
crc ^= d
for i in range(32):
if crc & 0x80000000:
crc = (crc << 1) ^ 0x04C11DB7 #Polynomial used in STM32
else:
crc = (crc << 1)
crc = (crc & 0xFFFFFFFF)
return crc
现在通过此函数的 '+' 字符的实际值是(正如人们可能期望的那样)0x2B,但是当 Python 到达行
时crc ^= d
我遇到以下错误
unsupported operand type(s) for ^=: 'long' and 'str'
我试过将值转换为 chr()、hex()、int()、long() 等,但都无济于事。似乎 Python 正在将“+”值解释为字符或字符串。
根据 juanpa 的评论,对代码进行以下修改可以正确处理数据。
# Computes CRC checksum using CRC-32 polynomial
def crc_stm32(self,data):
crc = 0xFFFFFFFF
for d in map(ord,data):
crc ^= d
for i in range(32):
if crc & 0x80000000:
crc = (crc << 1) ^ 0x04C11DB7 #Polynomial used in STM32
else:
crc = (crc << 1)
crc = (crc & 0xFFFFFFFF)
print crc
return crc