CRC校验码举例

一、首先复习一下异或运算(XOR),相同得0,相异得1.

二、多项式算数

   使用多项式算数是为了是为了在进行二进制计算时无需考虑进位问题。

   CRC中用到的除数正是由多项式的各项系数组成。

   比如

java crc校验 crc_parse crc校验例子_数据

+

java crc校验 crc_parse crc校验例子_校验码_02

+

java crc校验 crc_parse crc校验例子_校验码_03

+1,CRC除数为10111。

三、计算步骤

   1.展开多项式,得到CRC除数。

   2.数据串:在原始数据末端加“0”,0的数量等于多项式的阶数(最高次)。如上例,阶数为4,加4个0。

   3.将数据串第一个1与除数左对齐,按位进行异或操作,未处理的数据接在异或操作的结果后面,作为新数据串,重复操作

    原始数据100111010 ,  多项式

java crc校验 crc_parse crc校验例子_数据

+

java crc校验 crc_parse crc校验例子_校验码_02

+

java crc校验 crc_parse crc校验例子_校验码_03

+1,除数10111,新数据串1001110100000

    1001110100000

 10111                    

    0010010100000

     10111                

        00101100000

         10111            

            000010000

                 10111    

                    00111

  所得到的结果即为CRC校验和,长度为除数减1,校验和0111。将校验和加在数据项之后,即为带有CRC校验的数据:1001110100111。

  需要注意的是:当最后结果有效位较少时,补上相应位数的0(等于多项式阶数),再进行拼接。

  接收端校验CRC:

    1001110100111

 10111                    

    0010010100111

     10111                

        00101100111

         10111            

            000010111

                 10111    

                    00000

能除尽(余数为0),码串正确;除不尽(余数不为0),码串错误。

http://www.ip33.com/crc.htmlCRC在线计算网站,验证

java crc校验 crc_parse crc校验例子_校验码_07

 结果不一致,一定是哪里出了问题,用单比特数据算一下,与手算结果相同。

 

java crc校验 crc_parse crc校验例子_校验码_08

 查阅资料发现crc生成多项式应满足特定的条件,不能随意选取。

从该篇文章知, 多项式

java crc校验 crc_parse crc校验例子_数据

+

java crc校验 crc_parse crc校验例子_校验码_02

+

java crc校验 crc_parse crc校验例子_校验码_03

+1用于3位信息码的编码,对应16进制数0-7,总码长7位。因此对于超过3位的数据,不能保证其正确性。建议使用规范的多项式。

补充(来自百度):

循环冗余校验码(CRC)的基本原理:

在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x),根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。