更新时间:作者:小小条
示例1
循环冗余校验(CRC)是一种常用的错误检测算法,广泛应用于数据存储和通信系统中。CRC32是CRC算法的一种,生成32位的校验和。CRC32基于多项式除法原理,将数据视为二进制系数的大型多项式,CRC32的计算基于二进制模2运算,这是一种没有进位和借位的运算,实际上等价于异或(XOR) 操作。
CRC32最常用的一个生成多项式是:

x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1最高位 x³² 的系数是1(但我们通常不表示它,因为它总是1,并且决定了CRC是32位的)。x³¹ 到 x²⁷ 的系数都是0。x²⁶ 的系数是1。x²⁵ 和 x²⁴ 的系数是0。x²³ 的系数是1。... 以此类推。
最终,系数的二进制序列是:1 0000 0100 1100 0001 0001 1101 1011 0111(共33位,最高位的1是隐含的)。在代码实现中,我们通常使用这个33位数的低32位,即 0x04C11DB7(反转多项式为0xEDB88320)。
uint32_t calculate_crc32(const uint8_t *data, size_t length) { uint32_t crc = 0xFFFFFFFF; uint32_t polynomial = 0xEDB88320; for (size_t i = 0; i < length; i++) { // 将当前字节与CRC进行异或 crc ^= data[i]; // 处理每个字节的8位 for (int j = 0; j < 8; j++) { if (crc & 1) { crc = (crc >> 1) ^ polynomial; } else { crc >>= 1; } } } return crc ^ 0xFFFFFFFF;}
int main(void) { const char *test_string = "Hello, CRC32!"; uint32_t crc = calculate_crc32(test_string, strlen(test_string)); printf("字符串: %s\n", test_string); printf("CRC32值: 0x%08X\n", crc); return 0;}
字符串: Hello, CRC32!CRC32值: 0xEE2AF3F1
版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除