如何在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
我喜欢重建 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