已经进行了CRC32处理的数据的CRC32,其中包含附加的CRC数据

4

我使用以下 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;
}

当我将CRC32应用于任何数据并将生成的4个字节与数据连接起来,再次运行此程序时,它总是以以下结果结束:

crc32 = 0x2144DF1C

是否有人知道为什么会出现这种情况?


请查看此处:http://www.danielvik.com/2010/10/calculating-reverse-crc.html,特别是“reversing crc”部分。它演示了如何通过将四个字节附加到数据上来获取任何所需的CRC。 - Eugene Sh.
非常感谢。我一定会仔细看的。 - mrhpogie
2个回答

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。

1
由于以下两行代码,crc32应该始终为0x2144DF1C:
    crc = accumulatedCrc32 ^ 0xFFFFFFFF;

    return crc ^ 0xFFFFFFFF;

当在包含原始数据和crc的数据上重新生成crc时,请检查值0x2144DF1C。如果这两行是:

    crc = 0;

    return crc;

如果您在数据 + crc 上再次运行 crc,那么您将得到零的 crc。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接