如何在python中重建libmem_crc32_direct CRC函数?

How to rebuild the libmem_crc32_direct CRC function in python?

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

我之前用过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中的值。所以我想我犯了一些错误。

有什么想法吗?

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

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

B 有点棘手,因为 PC 上的 64 位算法与 ARM STM32F4 上的 32 位算法相比,但最终这个解决方案有效:

def libmem_crc32_direct_with_xor(im, startAddr, l):
    fw = im[startAddr:startAddr+l]
    crcGen =  crcmod.Crc(0x104C11DB7, initCrc=0xFFFFFFFF, rev = False)
    crcGen.update(fw)
    return (~crcGen.crcValue ) & 0xFFFFFFFF # 32bit xor