很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标.docVIP

  • 829
  • 0
  • 约4.66千字
  • 约 3页
  • 2017-03-28 发布于重庆
  • 举报

很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标.doc

很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标

最近在搞CRC校验,用的是CRC16标准,查看了很多资料发现很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标准中的采用查表法的方式中那两个表格中的数是如何求出来的。可惜没有一个文章仔细的讲,更没有文章给出实例来算一算。 一切只能靠自己了,谁让我喜欢寻根摸底呢。研究了一下本站会员玉丫子的文章,自己琢磨了琢磨,终于知道是怎么算出来的了。 CRC16算法的生成多项式x^16 + x^15 + x^2 + 1CRC16常见的表格中的数据是按照先传输LSB,消息右移进寄存器来计算的。判断寄存器的LSB,将0x按位颠倒后(0)根据LSB的情况决定是否与寄存器异或即可如下所示1)从0~255中选取需要计算的数,将其对应的十六进制数放入一个长度为的寄存器; ? ? 2)如果寄存器的为1,将寄存器移1位,再与0位异或,否则仅将寄存器移1位; ? ? 3)重复第2步,直到全部寄存器; ? ? 4)寄存器中的值则为校验码。auchCRCHi[]的第三个值就是0x 81,auchCRCLo[]的第三个值就是0xC1,可见计算无误。 另一个计算实例,从0~255中挑选11(对应0x0B)计算其CRC值: 0x0B的CRC-16的表格计算(反向)00001011?-?最低位LSB?=?1, 高八位填充0 ?????000001011?右移,高位填充0,并舍弃最后一位 00000001?-与0xA001异或 ??????----------------- 第一次计算 ???? 00000100 -?LSB?=?0000000100 右移,舍弃最后一位 ??????----------------- 第二次 ???? 00000010?-?LSB?=?0 ?????000000010右移,舍弃最后一位 ----------------- 第三次 ???? 00000001?-?LSB?=?1 ?????000000001右移,舍弃最后一位 00000001?-与0xA001异或 ??????----------------- 第四次 ???? 00000001?-?LSB?=?1 ?????000000001右移,舍弃最后一位 00000001?-与0xA001异或 ??????----------------- 第五次 ???? 00000001?-?LSB?=?1 ?????000000001右移,舍弃最后一位 00000001?-与0xA001异或 ??????----------------- 第六次 ???? 00000001?-?LSB?=?1 ?????1000000001右移,舍弃最后一位 00000001?-与0xA001异或 ??????----------------- 第七次 ??? 10000001?-?LSB?=?1 ?????010000001右移,舍弃最后一位 00000001?-与0xA001异或 ??????----------------- 一共算八次,得到的结果为CRC ?????01000001?-?CRC: 0xC7 41 从本文最后的附表中可以看出auchCRCHi[]的第12个值就是0x 41,auchCRCLo[]的第12个值就是0xC7,可见计算无误。 附:CRC-16的CRC数值表 const unsigned char auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41

文档评论(0)

1亿VIP精品文档

相关文档