16 位 CRC 校验原理与算法分析 这里,不讨论 CRC 的纠错原理以及为什么要选下面提及的生成多项式,只是针对以下的生成多项式,如何获得 CRC 校验码,作一个比较详细的说明
标准 CRC 生成多项式如下表: 名称 生成多项式 简记式* 标准引用 CRC-4 x4+x+1 3 ITU G
704 CRC-8 x8+x5+x4+1 0x31 CRC-8 x8+x2+x1+1 0x07 CRC-8 x8+x6+x4+x3+x2+x1 0x5E CRC-12 x12+x11+x3+x+1 80F CRC-16 x16+x15+x2+1 8005 IBM SDLC CRC16-CCITT x16+x12+x5+1 1021 ISO HDLC, ITU X
42, PPP-FCS CRC-32 x32+x26+x23+
+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS CRC-32c x32+x28+x27+
+x8+x6+1 1EDC6F41 SCTP 生成多项式的最高位固定的1,故在简记式中忽略最高位 1 了,如 0x1021 实际是 0x11021
I、基本算法(人工笔算): 以 CRC16-CCITT为例进行说明,CRC 校验码为 16 位,生成多项式 17 位
假如数据流为 4 字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]; 数据流左移 16 位,相当于扩大 256×256 倍,再除以生成多项式 0x11021,做不借位的除法运算(相当于按位异或),所得的余数就是 CRC 校验码
发送时的数据流为 6 字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、CRC[0]; II、计算机算法 1(