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

你可能感兴趣的文章
NN&DL4.7 Parameters vs Hyperparameters
查看>>
NN&DL4.8 What does this have to do with the brain?
查看>>
nnU-Net 终极指南
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
NO 157 去掉禅道访问地址中的zentao
查看>>
no available service ‘default‘ found, please make sure registry config corre seata
查看>>
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
查看>>
no connection could be made because the target machine actively refused it.问题解决
查看>>
No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
查看>>
No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
查看>>
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
查看>>
No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
查看>>
No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
查看>>
No module named 'crispy_forms'等使用pycharm开发
查看>>
No module named 'pandads'
查看>>
No module named cv2
查看>>
No module named tensorboard.main在安装tensorboardX的时候遇到的问题
查看>>
No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
查看>>
No new migrations found. Your system is up-to-date.
查看>>