最近工作学习到Modbus、Ymodem等协议,均涉及到CRC16校验算法,故而有必要深入了解CRC16校验算法的原理。以CRC16_Modbus为例:

#include<iostream> using namespace std;const unsigned short poly = 0xA001;unsigned short check(unsigned *data,unsigned short CRCIn,int n)
{int count = 0,i = 0;unsigned short CRC16 = CRCIn;unsigned short temp;/*while(i < n){CRC16 ^= data[i];while(count < 8){temp = (unsigned short)(CRC16 & 0x0001);CRC16 >>= 1;if(temp == 1){CRC16 = CRC16 ^ poly;}else{CRC16 = CRC16 & 65535; }count++;}i++;}return CRC16;*/for(int i = 0; i < n; i++){CRC16 ^= data[i];for(int j = 0; j < 8; j++){temp = (unsigned short)(CRC16 & 0x0001);CRC16 >>= 1;if(temp == 1){CRC16 = CRC16 ^ poly;}else{CRC16 = CRC16 & 65535; }}}return CRC16;}int main()
{int n;unsigned short CRCIn = 0xFFFF; cout<<"请输入总字节数:";cin>>n;unsigned a[n];for(int i = 0; i < n; i++){cout<<"请输入第"<<i+1<<"个字节数据:";cin>>a[i];} CRCIn = check(a,CRCIn,n);cout<<"计算结果为:"<<CRCIn<<endl;return 0;
}

算法原理:
首先明确该协议CRC16校验算法的CRCIn(CRC初始值)以及poly(多项式)。
1、将CRCIn传入CRC16寄存器;
2、将CRC16的低字节与数据的第一字节进行异或运算;
3、取出运算结果的最低位(记为temp用于后续判断),将CRC16右移1位;
4、如果temp为1则将CRC16与poly进行异或运算;
5、重复3~4步直至执行8次移位操作;
6、重复执行2~5步直至数据的所有字节均处理完毕。
最后CRC16寄存器的值就是所求的校验码。
结果:

51925 = 0xCAD5

CRC16_Modbus传输时先传输CRC16的低字节再传输高字节。
留下的疑问:采用注释区两个while循环嵌套的写法得到的结果与两个for循环嵌套的写法不同,还望高人指点。

CRC16_Modubus校验算法相关推荐

  1. crc16算法php实现,关于实现CRC16校验算法的两个函数

    之前在2017年2月份发布过一个主题,也是关于CRC16的,现在我直接把函数写出来,希望能帮到有需要的朋友.对于在线监测设备数据传输标准来说,CRC16校验算法有基于通用modbus协议的,有基于环保 ...

  2. 我也聊聊串口通信协议:数据包校验与常用校验算法

    本篇博客主要记载了我对数据校验过程以及奇偶校验的理解. 1.数据校验过程 由于数据传输距离的因素影响,计算机和受控设备间的通信数据就常常出现不可预知的错误.为了防止这些错误所带来的影响,一般在通信时采 ...

  3. Adler-32校验算法

    Adler-32校验算法 Adler-32是Mark Adler发明的校验和算法,和32位CRC校验算法一样,都是保护数据防止意外更改的算法,但是这个算法较容易被伪造,所以是不安全的保护措施.但是比C ...

  4. linux之网络编程ICMP校验算法

    1.ICMP校验算法代码 unsigned short cal_chksum(unsigned short *addr,int len) { int nleft = len; int sum = 0; ...

  5. 完整性校验用到常见的算法_几种常见的校验算法

    素材来源:网络 编辑整理:strongerHuang UART有一个奇偶校验,CAN通信有CRC校验.Modbus.MAVlink.USB等通信协议也有校验信息. 在自定义数据存储时,有经验的工程师都 ...

  6. 常用校验算法CRC、MD5、SHA_转

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

  7. crc16校验c语言单片机实现,三种常用的CRC16校验算法的C51程序的优化

    CRC校验又称为循环冗余校验,是数据通讯中常用的一种校验算法.它可以有效的判别出数据在传输过程中是否发生了错误,从而保障了传输的数据可靠性. CRC校验有多种方式,如:CRC8.CRC16.CRC32 ...

  8. 身份证号码含义及最后一位校验算法(ISO 7064:1983.MOD 11-2)

    身份证的各位数字代表的含义 ISO 7064:1983.MOD11-2校验码计算法 : (身份证校验码-第18位) 校验码计算(Python 代码) 身份证的各位数字代表的含义 1.前1.2位数字表示 ...

  9. 异或校验算法 c语言程序,C# 异或校验算法

    C# 的异或校验算法 直接上代码 public partial class FormCRC : Form { public FormCRC() { InitializeComponent(); } p ...

最新文章

  1. “智源论坛Live”报名 | 清华大学岂凡超:义原知识库的应用和扩充
  2. linux桥接实现交换机功能
  3. 大话移动开发之QT-Quick
  4. Java 反射的理解
  5. Vsftpd服务的部署及优化
  6. 网友提问:SAP FUNCTION使用cl_http_client POST REQUEST的问题
  7. AndroidX 方法数限制 Error:Cannot fit requested classes in a single dex file 64K问题
  8. eclipse下载与安装步骤详解,包含解决错误(最全最详细)
  9. notepad++ 使用去掉自动检查红线
  10. 作品2:资源管理器EX(原味浏览图片)
  11. ubuntu16.4安装部署过程
  12. (动态规划 最长有序子序列)Monkey and Banana --HDU --1069
  13. UVA10534 Wavio Sequence【LIS+DP】
  14. 生产者和消费者问题变形
  15. VKTM进程消耗大量CPU的问题
  16. c语言中竖线的作用,竖线符号
  17. 基本共射放大电路概念详解
  18. linux系统安装windows字体
  19. 【计算机网络】第八话 · 数据链路层的功能
  20. 互联网创业必备工具盘点

热门文章

  1. 【论文精读】深度学习脑部医学图像双任务:联合配准和肿瘤分割
  2. 【新品发布】三颗国产新“芯”硬核亮相——1颗电机驱动IC+2颗电源管理IC
  3. linux下用google protocol buffer(gpb)出现的编译问题------前后耗掉1个多小时
  4. Go 语言又称 Golang,是谷歌(Google)开发的一种静态强类型、编译型、并发型的编程语言。2009 年 11 月 10 日,Go 语言以开源方式向全球发布,如今许多大公司纷纷选择使用 Go
  5. 抖音,才是阅后即焚的无压力社交!
  6. 江苏2021高考成绩学校可查询吗,2021年江苏高考成绩几号公布可以查询,查询时间安排...
  7. Java学习笔记10(零压力理解继承多态权限修饰符)
  8. 穷举算法——鸡兔同笼问题
  9. ei和elsiver
  10. 最新最全!2020全国高校名单