博客
关于我
crc16校验代码中 多项式码明明是8005 为什么要用A001来异或,还有CRC16-REV=A001是什么意思
阅读量:128 次
发布时间:2019-02-27

本文共 1208 字,大约阅读时间需要 4 分钟。

0x8005=1000 0000 0000 0101B

0xA001=1010 0000 0000 0001B
对比两个二进制高低bai位正好是完du全相反的,CRC校验分为zhi正向校验与反向校验。正dao向校验高位在左,反向校验低位在左,比如正向CRC校验的数据为0xAF5D=1010 1111 0101 1101B与0x8005异或时应该是0xAF5D^0x8005,而要使用0xA001与数据进行校验也应该使0xAF5D高低位换顺序为0xBAF5=1011 1010 1111 0101B。正向校验使用左移位,反向校验使用右移位,其实原理是一样的,得看校验的数据高低位顺序。

请注意使用时高低位的区别,0X8005和0XA001实际上只是高低位互反,有些硬件的存储模式不一样,因为会根据情况调整使用的具体方法,算法并无本质区别,希望能帮到你。

一般电气、自动化仪表的crc16校验,多项式码选用16进制A001。

 

附参考:

数据(16进制):01 03 61 00 00 02 CRC校验:F7 DB     多项式是A001H

附C语言实现代码:

 
  1.  
  2. #include <stdio.h>

  3.  
  4.  
  5.  
  6. int main(void)

  7. {

  8. unsigned short tmp = 0xffff;

  9. unsigned short ret1 = 0;

  10. unsigned char buff[6] = {0};

  11. buff[0] = 0x01;

  12. buff[1] = 0x03;

  13. buff[2] = 0x61;

  14. buff[3] = 0x00;

  15. buff[4] = 0x00;

  16. buff[5] = 0x02;

  17.  
  18. for(int n = 0; n < 6; n++){/*此处的6 -- 要校验的位数为6个*/

  19. tmp = buff[n] ^ tmp;

  20. for(int i = 0;i < 8;i++){ /*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/

  21. if(tmp & 0x01){

  22. tmp = tmp >> 1;

  23. tmp = tmp ^ 0xa001;

  24. }

  25. else{

  26. tmp = tmp >> 1;

  27. }

  28. }

  29. }

  30. /*CRC校验后的值*/

  31. printf("%X\n",tmp);

  32. /*将CRC校验的高低位对换位置*/

  33. ret1 = tmp >> 8;

  34. ret1 = ret1 | (tmp << 8);

  35. printf("ret: %X\n",ret1);

  36. return 0;

  37. }

输出结果:

 
  1. F7DB

  2. ret: DBF7

另外用CRC校验工具得到结果是相同的但是多项式却是8005,只有表中选项出上面结果,其他选线选择或不选结果是另外的。

01 03 61 00 00 02的CRC校验结果

01 03 61 00 00 02的倒序是40 00 00 86 C0 80

结果也不相同。也不是倒序。不知道为什么?

 

转载地址:http://lcpb.baihongyu.com/

你可能感兴趣的文章
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>