我正在使用一个生成循环冗余校验值的函数。在通过串行发送数据包之前,我似乎遇到了一些问题,而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
现在,通过这个函数的'+'char的实际值是(正如人们预期的那样)0x2B,但是当Python到达该行时
crc ^= d
我遇到以下错误
^ =:'long'和'str'
的不支持的操作数类型
我已经尝试将值转换为chr(),hex(),int(),long()等等都无济于事。似乎Python将'+'值解释为char或string。
答案 0 :(得分:0)
根据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