Python中按位异或的不支持的操作数类型

时间:2018-04-30 20:08:59

标签: python bitwise-or

我正在使用一个生成循环冗余校验值的函数。在通过串行发送数据包之前,我似乎遇到了一些问题,而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。

1 个答案:

答案 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