crc校验码计算代码c语言_crc16几种标准校验算法及c语言代码
一、 CRC-16校验码的使用现在选择最常用的CRC-16校验码,并说明其使用方法。
根据Modbus协议,常规485通信的信息传输形式如下:
地址功能码数据信息校验码
1字节1字节2字节
CRC校验是前面几段数据的校验值,是一个16位的数据。发送时,低8位在前,高8位在后。
例如,信息字段代码为:1011001,验证字段为:1
发送方:发送的传输字段为:1 0 1 1 0 1 0 1 0 10。
信息字段检查字段
接收方:使用相同的计算方法计算信息字段的校验码,并与实际收到的校验码进行比较。如果相等,信息正确,如果不相等,信息错误;或者把接收到的信息全部用多项式除,如果能整除,信息就是正确的。
二、CRC16校验码计算方法常用查表法和计算法。计算方法一般是:
(1)预置一个16位寄存器为十六进制FFFF(即全1),调用这个寄存器CRC
(2)、第一个8位二进制数据(即通信信息帧的第一个字节)和16位CRC寄存器的低位
8位异或,将结果放入CRC寄存器,数据的高八位不变;
(3)将CRC寄存器的内容右移一位(向低位),最高位填充0,右移后检查移出的位;
(4)如果移出位为0:重复步骤3(再次右移一位);如果移出位为1,则CRC寄存器等于many。
异或项A001(101000000000001);
(5)重复步骤3和4,直到它向右移动8次,这样所有的8位数据都被处理;
(6)重复步骤2至5以处理通信信息帧的下一个字节;
(7)按照上述步骤计算完通信信息帧的所有字节后,得到16位CRC寄存器的高低。
字节被交换;
(8)最后的CRC寄存器内容是:CRC码。
以上计算步骤中的多项式A001是8005逐位求逆的结果。
查表法是将移位异或的计算结果制成表格,即将0~256放入一个16位寄存器的低八位,高八位用0填充。然后按照上面的步骤3、4直到8位全部去掉,最后寄存器中的值就是表中的数据,高8位和低8位分别列出。
:几种常见标准的三、CRC16算法常见的标准有以下几种,在各种规范中都有使用,它们的算法原理基本相同,就是数据输入输出有区别。这里列举了这些标准的区别,并给出了C语言的算法实现。
CRC16_CCITT:多项式x16 x12 x5 1(0x1021),初始值为0x0000,低位在前,高位在后,结果与0x0000异或。
CRC16_CCITT_FALSE:多项式x16 x12 x5 1(0x1021),初始值0xFFFF,低位最后,高位先,结果与0x0000异或。
CRC16_XMODEM:多项式x16 x12 x5 1(0x1021),初始值0x0000,低位最后,高位先,结果与0x0000异或。
CRC16_X25:多项式x16 x12 x5 1(0x1021),初始值0x0000,低位优先,高位最后,结果与0xFFFF异或。
CRC16_MODBUS:多项式x16 x15 x5 1(0x8005),初始值0xFFFF,低位优先,高位最后,结果与0x0000异或。
CRC16_IBM:多项式x16 x15 x5 1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或。
CRC16_MAXIM:多项式x16 x15 x5 1(0x8005),初始值0x0000,低位优先,高位最后,结果与0xFFFF异或。
CRC16_USB:多项式x16 x15 x5 1(0x8005),初始值0xFFFF,低位先,高位后,结果与0xFFFF异或。
四、 CRC 16 1的算法原理及程序。根据CRC 16的标准选择CRCIn的初始值。
2.将数据的第一个字节与CRCIn的高8位进行异或运算。
3.判断最高位。如果是0,则左移一位;如果为1,则将其左移一位,然后与多项式十六进制码进行异或运算。
4.重复3,直到完成所有8位移位计算。
5.对所有输入数据操作重复上述步骤,以获得16位CRC校验码。
根据算法原理与标准要求就能简单的写出具体程序:
[cpp]查看普通副本无符号短CRC 16 _ CCITT(无符号char * puch msg,无符号int usDataLen)
{
无符号短整型wCRCin=0x0000
无符号短整型wCPoly=0x1021
无符号字符wChar=0;
while (usDataLen -)
{
wChar=*(puchMsg);
InvertUint8(wChar,wChar);
WCR^=(wchar《8》CIN);
for(int I=0;我《8;我)
{
if(wCRCin0x8000)
^ wcpoly CIN=(WCR CIN《1》);
其他
WCRCIN=WCRCIN《1;
}
}
InvertUint16(wCRCin,WCR CIN);
返回(WCRCIN);
}
无符号短整型CRC16_CCITT_FALSE(无符号char *puchMsg,无符号国际美元数据)
{
无符号短整型wCRCin=0xFFFF
无符号短整型wCPoly=0x1021
无符号字符wChar=0;
while (usDataLen -)
{
wChar=*(puchMsg);
WCR^=(wchar《8》CIN);
for(int I=0;我《8;我)
{
if(wCRCin0x8000)
^ wcpoly CIN=(WCR CIN《1》);
其他
WCRCIN=WCRCIN《1;
}
}
返回(WCRCIN);
}
无符号短整型CRC16_XMODEM(无符号char *puchMsg,无符号国际美元数据)
{
无符号短整型wCRCin=0x0000
无符号短整型wCPoly=0x1021
无符号字符wChar=0;
while (usDataLen -)
{
wChar=*(puchMsg);
WCR^=(wchar《8》CIN);
for(int I=0;我《8;我)
{
if(wCRCin0x8000)
^ wcpoly CIN=(WCR CIN《1》);
其他
WCRCIN=WCRCIN《1;
}
}
返回(WCRCIN);
}
无符号短整型CRC16_X25(无符号char *puchMsg,无符号国际美元数据)
{
无符号短整型wCRCin=0xFFFF
无符号短整型wCPoly=0x1021
无符号字符wChar=0;
while (usDataLen -)
{
wChar=*(puchMsg);
InvertUint8(wChar,wChar);
WCR^=(wchar《8》CIN);
for(int I=0;我《8;我)
{
if(wCRCin0x8000)
^ wcpoly CIN=(WCR CIN《1》);
其他
WCRCIN=WCRCIN《1;
}
}
InvertUint16(wCRCin,WCR CIN);
返回(wcrcin^0xffff);
}
无符号短整型CRC16_MODBUS(无符号char *puchMsg,无符号国际美元数据)
{
无符号短整型wCRCin=0xFFFF
无符号短wCPoly=0x8005
无符号字符wChar=0;
while (usDataLen -)
{
wChar=*(puchMsg);
InvertUint8(wChar,wChar);
WCR^=(wchar《8》CIN);
for(int I=0;我《8;我)
{
if(wCRCin0x8000)
^ wcpoly CIN=(WCR CIN《1》);
其他
WCRCIN=WCRCIN《1;
}
}
InvertUint16(wCRCin,WCR CIN);
返回(WCRCIN);
}
无符号短整型CRC16_IBM(无符号char *puchMsg,无符号国际美元数据)
{
无符号短整型wCRCin=0x0000
无符号短wCPoly=0x8005
无符号字符wChar=0;
while (usDataLen -)
{
wChar=*(puchMsg);
InvertUint8(wChar,wChar);
WCR^=(wchar《8》CIN);
for(int I=0;我《8;我)
{
if(wCRCin0x8000)
^ wcpoly CIN=(WCR CIN《1》);
其他
WCRCIN=WCRCIN《1;
}
}
InvertUint16(wCRCin,WCR CIN);
返回(WCRCIN);
}
无符号短整型CRC16_MAXIM(无符号char *puchMsg,无符号国际美元数据)
{
无符号短整型wCRCin=0x0000
无符号短wCPoly=0x8005
无符号字符wChar=0;
while (usDataLen -)
{
wChar=*(puchMsg);
InvertUint8(wChar,wChar);
WCR^=(wchar《8》CIN);
for(int I=0;我《8;我)
{
if(wCRCin0x8000)
^ wcpoly CIN=(WCR CIN《1》);
其他
WCRCIN=WCRCIN《1;
}
}
InvertUint16(wCRCin,WCR CIN);
返回(wcrcin^0xffff);
}
无符号短整型CRC16_USB(无符号char *puchMsg,无符号国际美元数据)
{
无符号短整型wCRCin=0xFFFF
无符号短wCPoly=0x8005
无符号字符wChar=0;
while (usDataLen -)
{
wChar=*(puchMsg);
InvertUint8(wChar,wChar);
WCR^=(wchar《8》CIN);
for(int I=0;我《8;我)
{
if(wCRCin0x8000)
^ wcpoly CIN=(WCR CIN《1》);
其他
WCRCIN=WCRCIN《1;
}
}
InvertUint16(wCRCin,WCR CIN);
返回(wcrcin^0xffff);
}
推荐阅读
- 简述bjt工作原理_BJT的工作原理及结构特点
- 荆钗布裙的意思(荆钗布裙的出处及造句)
- 银行卡状态异常啥情况,银行卡状态异常是什么原因,要怎么办
- 索尼手机历代旗舰机? 索爱手机最新款2021
- 斐讯路由器怎么设置才能上网,斐讯路由器该怎么设置
- 汽车怎样才能省油,汽车怎样省油 这几个方法教你如何省油
- 如何用苹果手机测网速,如何用苹果手机的app试玩挣外块
- 四平八稳的意思(四平八稳的出处及造句)
- 山人运动手机版软件介绍(山人运动手机版)
- 如何给电脑锁屏,怎么给电脑锁屏,电脑上锁!
- 迈腾和雅阁哪个安全系数更高,迈腾撞了雅阁之后,迈腾车主说了一句话
- 怎么让声音好听,怎么让说话声音更好听
- 驾校考试一点通官方版软件介绍(驾校考试一点通官方版)
- 爷爷奶奶对孙子结婚祝词?(简短又洋气的结婚祝福)
- 手机qq怎么转让群主,手机QQ怎么转让QQ群
- 工业互联网对制造企业来说它的价值是什么意思_工业互联网对制造企业来说它的价值是什么
- 长期使用气垫的危害有多大,长期使用气垫的危害
- 电脑桌面壁纸怎么设置固定不变,电脑桌面壁纸怎么设置
- 索爱耳机使用方法? 索尼爱立信mk16i