首页 > 解决方案 > 如何在python中重建libmem_crc32_direct CRC函数?

问题描述

我喜欢libmem_crc32_direct在 python 中重建函数。

crcmod以前用过python包。所以我喜欢使用它来设置 crc 生成器。

c代码看起来像:

uint32_t crc_process_chunk(uint8_t* data, uint32_t len) {
  return ~libmem_crc32_direct(data, len, 0xFFFFFFFF);
}

我的python代码看起来到目前为止:

def bit_not(n, numbits=8):
    return (1 << numbits) - 1 - n

def getCRC(imageBA):
    crcGen = crcmod.mkCrcFun(0x104C11DB7, initCrc=0xFFFFFFFF)
    val = crcGen(imageBA)
    val = bit_not(val, 32)
    return val

python代码的返回值与c中的不相等。所以我想我犯了一些错误。

有任何想法吗?

标签: pythoncstm32crc

解决方案


不是 (1 << numbits) == 0 吗?如果这是二进制补码数学,它应该可以工作,因为 bit_not 可以返回 0-1-n。但是,这不是必需的,因为 crcmod 有一个可选的 xorOut 参数。我在想,由于反向(反射)输入和输出的可选 rev 参数默认为 true,因此需要将其设置为 false。我认为创建 crc 生成器的调用应该是:

    crcGen = crcmod.mkCrcFun(0x104C11DB7, initCrc=0xFFFFFFF, rev=False, xorOut=0xFFFFFFFF)

推荐阅读