已附加CRC数据的已CRC32处理数据的CRC32

mrh*_*gie 4 c crc32

我使用以下C算法在数据上计算CRC32:

#define CRC32_POLYNOM_REVERSED   0xEDB88320

uint32 calcCrc32(uint8* buffer, uint32 bufferSize) {
    return accumulateCrc32(0, buffer, bufferSize);
}

uint32 accumulateCrc32(uint32 accumulatedCrc32, uint8* buffer, uint32 bufferSize) {
    uint32 i, j;
    uint32 crc, mask;

    crc = accumulatedCrc32 ^ 0xFFFFFFFF;

    for (i = 0; i < bufferSize; i++) {
        crc ^= buffer[i];
        for (j = 8; j > 0; j--) {
            mask = -(crc & 1);
            crc = (crc >> 1) ^ (CRC32_POLYNOM_REVERSED & mask);
        }
    }

    return crc ^ 0xFFFFFFFF;
}
Run Code Online (Sandbox Code Playgroud)

当我将其应用于任何数据并将结果的4个字节的CRC32连接到该数据并再次通过此例程运行时,它总是以结果结尾

crc32 = 0x2144DF1C

任何人都有一个主意,为什么会这样?

Mar*_*ler 5

这是CRC的数学特性。如果将未经预处理或后处理的“纯” CRC附加到消息中,则整个对象的CRC将始终为零。实际上,这可以简化硬件中带有CRC的消息检查,因为您可以通过CRC寄存器运行整个消息和CRC,并检查最后的结果是否为零。

在CRC的数学中,可以考虑除法运算,其中被乘数是消息,除数是CRC多项式,除法的其余部分是CRC。如果将CRC附加到消息中,则它实际上是减去了余数。然后,当您用多项式除以消息时,余数为零。在整数域中,137%7 ==4。我从137中减去4,得到133。然后是133%7 == 0。

在这种情况下,需要进行预处理和后期处理^ 0xFFFFFFFF。那么结果不是零,而是一个不同的常数。该常数就是消息“ 00 00 00 00”的CRC。