Как перестроить функцию CRM libmem_crc32_direct в python? - PullRequest
0 голосов
/ 11 июля 2019

Мне нравится перестраивать функцию 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.Так что, наверное, я с ума схожу от какой-то ошибки.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 16 июля 2019

Разве (1 << numbits) == 0? Если это математика дополнения до двух, она должна работать, так как bit_not может вернуть 0-1-n. Однако в этом нет необходимости, поскольку для crcmod есть необязательный параметр xorOut. Я думаю, что, поскольку необязательный параметр rev для обратного (отраженного) ввода и вывода по умолчанию имеет значение true, для него необходимо установить значение false. Я думаю, что вызов для создания генератора CRC должен быть: </p>

    crcGen = crcmod.mkCrcFun(0x104C11DB7, initCrc=0xFFFFFFF, rev=False, xorOut=0xFFFFFFFF)
0 голосов
/ 16 июля 2019

B бит хитрый, потому что 64-битная арифметика на ПК против 32-битной арифметики на ARM STM32F4, но, наконец, это решение работает:

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
...