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

你可能感兴趣的文章
Nginx gateway集群和动态网关
查看>>
nginx http配置说明,逐渐完善。
查看>>
Nginx keepalived一主一从高可用,手把手带你一步一步配置!
查看>>
Nginx Location配置总结
查看>>
Nginx log文件写入失败?log文件权限设置问题
查看>>
Nginx Lua install
查看>>
nginx net::ERR_ABORTED 403 (Forbidden)
查看>>
vue中处理过内存泄露处理方法
查看>>
Nginx RTMP 模块使用指南
查看>>
Nginx SSL 性能调优
查看>>
nginx ssl域名配置
查看>>
Nginx SSL私有证书自签,且反代80端口
查看>>
Nginx upstream性能优化
查看>>
Nginx 中解决跨域问题
查看>>
nginx 代理解决跨域
查看>>
Nginx 做负载均衡的几种轮询策略分析
查看>>
Nginx 入门,一篇搞定!
查看>>
Nginx 利用代理转发请求示例
查看>>
Nginx 动静分离与负载均衡的实现
查看>>
Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
查看>>