博客
关于我
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/

你可能感兴趣的文章
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>