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

2024-10-01 00:22:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我喜欢用python重建^{}函数。你知道吗

我以前使用过crcmodpython包。所以我想用它来设置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中的值,所以我想我犯了一些错误。你知道吗

有什么想法吗?你知道吗


Tags: 函数代码datalenreturndefbitnot
2条回答

(1<;<;numbits)==0?如果这是2的补码数学,它应该工作,因为位\u不能返回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

相关问题 更多 >