【问题标题】:CRC32 of already CRC32 treated data with the CRC data appended已 CRC32 处理的数据的 CRC32 附加 CRC 数据
【发布时间】:2015-04-19 22:46:02
【问题描述】:

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

任何人有一个想法,为什么它会这样?

【问题讨论】:

标签: c crc32


【解决方案1】:

这是 CRC 的数学属性。如果没有预处理或后处理的“纯”CRC 附加到消息中,那么整个事物的 CRC 将始终为零。事实上,这简化了在硬件中使用 CRC 对消息的检查,因为您可以通过 CRC 寄存器运行整个消息和 CRC,并检查最后的结果是否为零。

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

在这种情况下,有预处理和后处理(^ 0xFFFFFFFFs)。那么结果不是零,而是一个不同的常数。该常数就是消息“00 00 00 00”的CRC。

【讨论】:

    【解决方案2】:

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

        crc = accumulatedCrc32 ^ 0xFFFFFFFF;
    
        return crc ^ 0xFFFFFFFF;
    

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

        crc = 0;
    
        return crc;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2020-04-03
      • 2012-01-11
      • 2011-01-30
      • 1970-01-01
      • 2016-10-19
      • 2013-09-09
      相关资源
      最近更新 更多