欢迎来到天天文库
浏览记录
ID:34766094
大小:69.18 KB
页数:3页
时间:2019-03-10
《很多讲的都是crc16-ccitt标准一直想弄明白crc-16标》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、最近在搞CRC校验,用的是CRC16标准,查看了很多资料发现很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标准中的采用查表法的方式中那两个表格中的数是如何求出来的。可惜没有一个文章仔细的讲,更没有文章给出实例来算一算。一切只能靠自己了,谁让我喜欢寻根摸底呢。研究了一下本站会员玉丫子的文章,自己琢磨了琢磨,终于知道是怎么算出来的了。CRC16算法的生成多项式x^16+x^15+x^2+1,十六进制表示为0x8005。CRC16常见的表格中的数据是按照先传输LSB,消息右移进寄存器来计算的。因此需要判断寄存器的最低位LSB,同时要将0x8005按位颠倒后(0xA001)根据L
2、SB的情况决定是否与寄存器异或即可。CRC16的表格中对应的数依次为0~255计算出来的CRC值,因此,此处只选取其中一两个数作为实例计算CRC值。具体步骤如下所示:1)从0~255中选取需要计算的数,将其对应的十六进制数放入一个长度为16的寄存器的低八位,高八位填充0; 2)如果寄存器的末位LSB为1,将寄存器的数值右移1位,再与0xA001位异或,否则仅将寄存器右移1位; 3)重复第2步,直到低八位全部右移出寄存器; 4)寄存器中的值则为校验码。从0~255中挑选2(对应0x02)计算其CRC值:0x02的CRC-16的表格计算(反向)0000000000000010 <- 最低
3、位LSB = 0,高八位填充0 00000000000000010 右移,高位填充0,并舍弃最后一位 -----------------第一次计算 0000000000000001<- LSB = 100000000000000001右移,舍弃最后一位 ^10100000 00000001 <-与0xA001异或 -----------------第二次 1010000000000001 <- LSB = 1 01010000000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或
4、 -----------------第三次 1111000000000001 <- LSB = 1 01111000000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或 -----------------第四次 1101100000000001 <- LSB = 1 01101100000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或 -----------------第五次 1100110000000001 <- LSB = 1
5、 01100110000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或 -----------------第六次 1100011000000001 <- LSB = 1 01100011000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或 -----------------第七次 1100001100000001 <- LSB = 1 01100001100000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或
6、 -----------------一共右移了八次,得到的结果为CRC 1100000110000001 <- CRC:0xC181从本文最后的附表中可以看出auchCRCHi[]的第三个值就是0x81,auchCRCLo[]的第三个值就是0xC1,可见计算无误。另一个计算实例,从0~255中挑选11(对应0x0B)计算其CRC值:0x0B的CRC-16的表格计算(反向)0000000000001011 <- 最低位LSB = 1,高八位填充0 00000000000001011 右移,高位填充0,并舍弃最后一位^10100000 00000001 <-与0xA
7、001异或 -----------------第一次计算 1010000000000100<- LSB = 001010000000000100右移,舍弃最后一位 -----------------第二次 0101000000000010 <- LSB = 0 00101000000000010右移,舍弃最后一位-----------------第三次 0010100
此文档下载收益归作者所有