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

时间:2015-02-18 19:15:53

标签: 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;
}

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

结束

crc32 = 0x2144DF1C

任何有想法的人,为什么表现得像这样?

2 个答案:

答案 0 :(得分:3)

这是CRC的数学属性。如果&#34;纯粹&#34;没有预处理或后处理的CRC被附加到消息中,然后整个事物的CRC将始终为零。实际上,这简化了在硬件中使用CRC检查消息的过程,因为您可以通过CRC寄存器运行整个消息和CRC,并检查结尾处的结果是否为零。

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

在这种情况下,有预处理和后处理(^ 0xFFFFFFFF s)。然后结果不是零,而是一个不同的常数。该常量只是消息的CRC&#34; 00 00 00 00&#34;。

答案 1 :(得分:1)

由于这两行,它应该总是以crc32 = 0x2144DF1C结束:

    crc = accumulatedCrc32 ^ 0xFFFFFFFF;

    return crc ^ 0xFFFFFFFF;

因此,当再次对包含原始数据+ crc的数据重新生成crc时,请检查值0x2144DF1C。如果这两行是:

    crc = 0;

    return crc;

如果你在data + crc上再次运行crc,你会得到一个零crc。