已经 CRC32 处理的数据的 CRC32 附加了 CRC 数据
CRC32 of already CRC32 treated data with the CRC data appended
我使用以下 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
有人知道为什么会这样吗?
由于这两行,它应该总是以 crc32 = 0x2144DF1C 结尾:
crc = accumulatedCrc32 ^ 0xFFFFFFFF;
return crc ^ 0xFFFFFFFF;
因此,当再次对包含原始数据 + crc 的数据重新生成 crc 时,检查值 0x2144DF1C 。如果这两行是:
crc = 0;
return crc;
如果你运行再次对数据+crc进行crc,你会得到一个零的crc。
这是 CRC 的数学 属性。如果 "pure" CRC 没有预处理或 post 处理,附加到消息中,那么整个事情的 CRC 将始终为零。事实上,这简化了在硬件中使用 CRC 校验消息的检查,因为您可以 运行 整个消息和 CRC 寄存器通过 CRC 校验,并检查最后的结果是否为零。
在CRC的数学中,可以考虑一个除法运算,被除数是消息,除数是CRC多项式,除法的余数是CRC。如果将 CRC 附加到消息,它实际上是在减去余数。然后,当您将 that 消息除以多项式时,您得到的余数为零。在整数领域,137 % 7 == 4。我从 137 中减去 4,得到 133。然后 133 % 7 == 0。
在这种情况下,有预处理和 post 处理(^ 0xFFFFFFFF
s)。那么结果不是零,而是一个不同的常量。该常数只是消息“00 00 00 00”的 CRC。
我使用以下 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
有人知道为什么会这样吗?
由于这两行,它应该总是以 crc32 = 0x2144DF1C 结尾:
crc = accumulatedCrc32 ^ 0xFFFFFFFF;
return crc ^ 0xFFFFFFFF;
因此,当再次对包含原始数据 + crc 的数据重新生成 crc 时,检查值 0x2144DF1C 。如果这两行是:
crc = 0;
return crc;
如果你运行再次对数据+crc进行crc,你会得到一个零的crc。
这是 CRC 的数学 属性。如果 "pure" CRC 没有预处理或 post 处理,附加到消息中,那么整个事情的 CRC 将始终为零。事实上,这简化了在硬件中使用 CRC 校验消息的检查,因为您可以 运行 整个消息和 CRC 寄存器通过 CRC 校验,并检查最后的结果是否为零。
在CRC的数学中,可以考虑一个除法运算,被除数是消息,除数是CRC多项式,除法的余数是CRC。如果将 CRC 附加到消息,它实际上是在减去余数。然后,当您将 that 消息除以多项式时,您得到的余数为零。在整数领域,137 % 7 == 4。我从 137 中减去 4,得到 133。然后 133 % 7 == 0。
在这种情况下,有预处理和 post 处理(^ 0xFFFFFFFF
s)。那么结果不是零,而是一个不同的常量。该常数只是消息“00 00 00 00”的 CRC。