【问题标题】:Unsupported operand types for bitwise exclusive OR in PythonPython 中不支持按位异或的操作数类型
【发布时间】:2018-04-30 20:08:58
【问题描述】:

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

我遇到以下错误

^= 不支持的操作数类型:“long”和“str”

我尝试将值转换为 chr()、hex()、int()、long() 等,但均无济于事。似乎 Python 将“+”值解释为字符或字符串。

【问题讨论】:

  • Python 是一种强类型语言。 data 中的每个对象都是一个字符串,但按位运算符需要 int 对象。我假设你想要for d in map(ord, data):
  • 您使用的是 Python 3 吗?如果是这样,data 应该是字节,而不是字符串。然后,您的代码将按原样运行。
  • @Blender data 可以bytes 对象,或 bytearray。不过,它目前是一个元组。无论如何,'long' 意味着 Python 2。
  • @chepner 迭代内存视图应该让你进入,至少在 Python 3 中

标签: python bitwise-or


【解决方案1】:

根据 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

【讨论】:

    猜你喜欢
    • 2013-12-08
    • 2020-12-04
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多