1.CRC16校验算法源码(易语言)
2.ç¨Cè¯è¨å®ç°CRCç¼ç ç¨åº
3.CRCåçç®ä»
4.CRC-8和CRC-16算法
CRC16校验算法源码(易语言)
CRC校验算法源码在易语言中的算源算法实现如下:
版本 2
子程序 _CRC校验计算, 参数 预校验内容, 预校验内容为字节型数组
局部变量 crc, 用于存储校验值,初始值为 "2"
局部变量 返回数据,代码 用于存储最终的校验值,类型为整数型
局部变量 j,算源算法 用于数组索引,类型为整数型
局部变量 被校验内容,代码 用于存储数组中的每个字节,类型为字节型
局部变量 i,算源算法 用于循环计数,类型为整数型
局部变量 CY,代码html 页脚源码 用于判断当前位是否为1,类型为整数型
局部变量 crc高位,算源算法 用于存储高位校验值,类型为文本型
局部变量 crc低位,代码 用于存储低位校验值,类型为文本型
初始化crc为 { ,算源算法 }
计次循环首 (取数组成员数 (预校验内容), j)
被校验内容 = 预校验内容 [j]
crc [2] = 位异或 (被校验内容, crc [2])
计次循环首 (8, i)
CY = 位与 (crc [2], 1) ' 检查CRC[2]与1有没有共同位
如果 (CY = 1) ' 如果CRC[2]与1有共同位
crc [2] = 右移 (crc [2], 1) ' 低位右移一位
如果真 (位与 (crc [1], 1) = 1) ' 如果校验高位与1有共同位
crc [2] = 位或 (crc [2], ) ' 给crc低位最高位补1
如果真结束
crc [1] = 右移 (crc [1], 1) ' crc高位右移一位
crc [2] = 位异或 (crc [2], 1) ' CRC低位与生成多项式0XA求异或
crc [1] = 位异或 (crc [1], ) ' CRC高位与生成多项式0XA求异或
否则
crc [2] = 右移 (crc [2], 1) ' 低为右移一位
如果真 (位与 (crc [1], 1) = 1) ' 如果校验高位与1有共同位
crc [2] = 位或 (crc [2], ) ' 给crc低位最高位补1
如果真结束
crc [1] = 右移 (crc [1], 1) ' 高位右移1位
否则结束
计次循环尾 ()
计次循环尾 ()
如果真 (取文本长度 (到文本 (crc [1])) = 1)
crc高位 = “” + 到文本 (crc [1])
如果真结束
如果真 (取文本长度 (到文本 (crc [1])) = 2)
crc高位 = “0” + 到文本 (crc [1])
如果真结束
如果真 (取文本长度 (到文本 (crc [1])) = 3)
crc高位 = 到文本 (crc [1])
如果真结束
如果真 (取文本长度 (到文本 (crc [2])) = 1)
crc低位 = “” + 到文本 (crc [2])
如果真结束
如果真 (取文本长度 (到文本 (crc [2])) = 2)
crc低位 = “0” + 到文本 (crc [2])
如果真结束
如果真 (取文本长度 (到文本 (crc [2])) = 3)
crc低位 = 到文本 (crc [2])
如果真结束
返回 (crc高位 + crc低位)
ç¨Cè¯è¨å®ç°CRCç¼ç ç¨åº
#include <stdio.h>
#include <string.h>
#include "stdlib.h"
unsigned int char2int(char *str)
{
unsigned int count=0, ret=0;
for(count = 0; count<strlen(str);count++)
{
ret = ret<<1;
if('0' != str[count])
{ ret+=1;}
}
return ret;
}
unsigned int getR(char *str)
{
unsigned int c =0 ;
int ret = strlen(str)-1;
for(c=0;c < strlen(str);c++)
{ if(str[c] != '0')<br/> { return ret-c;}
}
}
int getRi(unsigned int num)
{
int c =0;
for(;num != 0; c++)
{ num = num>>1;}
return c;
}
void CRC(char *scode, char *p, char*g )
{
unsigned int iP = char2int(p);
unsigned int iG = char2int(g);
unsigned int r= getR(g);
unsigned int code = iP << r;
unsigned int yx = code;
for(;getRi(yx) >= getRi(iG);)
{ yx = yx ^ (iG<<(getRi(yx) - getRi(iG)));}
code += yx;
itoa(code,scode,2);
}
void main() //å®ä¹ä¸»å½æ°
{
char data[8]="" , bds[8]="",code[]="";
printf("æ°æ®ï¼");
scanf("%s", data);
printf("表达å¼ï¼");
scanf("%s", bds);
CRC(code,data,bds);
printf("ç¼ç ï¼%s",code);
}
CRCåçç®ä»
æè¿å好ææ¶é´ï¼æ´çäºä¸ä¸å ³äºCRCçèµæï¼è¯¦ç»å¯¹æ¯äºä¸ç¨åºçå®ç°è¿ç¨ååçï¼å½ç¶ï¼é«æé½æ¯ä¸å¨æçã
æ¬æ主è¦ä»ç»CRCçä¸äºåºç¡ç¥è¯ï¼ä¸ªäººæ¶è·æ¯åé¢å ³äºç½ä¸æ åDemoç¨åºçä¸äºè¯¦ç»è§£æãè§ä¸ä¸ç¯/p/c0dc2ece
声æï¼æ¬æå®ä¹é¨ååèç½ä¸å¤å¤èµæï¼åªæ¯ä¸ºäºæ¹ä¾¿å个ç¬è®°ï¼å¼ç¨ç½æåä¸äºæ´æ¹ï¼å¦æé·åï¼è¯·ç§ä¿¡è¯´æ并修æ¹ã
ä¸ãå ³äºCRCçä»ç»
CRCå³å¾ªç¯åä½æ ¡éªç ï¼Cyclic Redundancy Checkï¼ï¼æ°æ®éä¿¡é¢åä¸æ常ç¨çä¸ç§å·®éæ ¡éªç ï¼å ¶ä¿¡æ¯å段åæ ¡éªå段é¿åº¦å¯ä»¥ä»»ææå®ï¼ä½è¦æ±éä¿¡åæ¹å®ä¹çCRCæ åä¸è´ã
äºãå·¥ä½åç
对äºå·¥æ§é¢åï¼æ们主è¦å©ç¨CRCæ ¡éªæ¥å¤çåç§æ°æ®æµçæ°æ®æ£ç¡®æ§æ ¡éªã
CRCåç ï¼å¨Kä½ä¿¡æ¯ç ï¼ç®æ åéæ°æ®ï¼ååæ¼æ¥Rä½æ ¡éªç ï¼ä½¿æ´ä¸ªç¼ç é¿åº¦ä¸ºNä½ï¼å æ¤è¿ç§ç¼ç ä¹å«ï¼N,Kï¼ç ãéä¿ç说ï¼å°±æ¯å¨éè¦åéçä¿¡æ¯åé¢éå ä¸ä¸ªæ°ï¼å³æ ¡éªç ï¼ï¼çæä¸ä¸ªæ°çåéæ°æ®åéç»æ¥æ¶ç«¯ãè¿ä¸ªæ°æ®è¦æ±è½å¤ä½¿çæçæ°æ°æ®è¢«ä¸ä¸ªç¹å®çæ°æ´é¤ãè¿éçæ´é¤éè¦å¼å ¥æ¨¡ 2é¤æ³çæ¦å¿µï¼éä¸ç¾åº¦ç¾ç§å ³äºæ¨¡2计ç®çé¾æ¥ï¼
/item/模2è¿ç®/?fr=aladdin
é£ä¹ï¼CRCæ ¡éªçå ·ä½åæ³å°±æ¯
ï¼1ï¼éå®ä¸ä¸ªæ åé¤æ°ï¼Kä½äºè¿å¶æ°æ®ä¸²ï¼
ï¼2ï¼å¨è¦åéçæ°æ®ï¼mä½ï¼åé¢å ä¸K-1ä½0ï¼ç¶åå°è¿ä¸ªæ°æ°ï¼M+K-1ä½ï¼ä»¥æ¨¡2é¤æ³çæ¹å¼é¤ä»¥ä¸é¢è¿ä¸ªæ åé¤æ°ï¼æå¾å°çä½æ°ä¹å°±æ¯è¯¥æ°æ®çCRCæ ¡éªç ï¼æ³¨ï¼ä½æ°å¿ é¡»æ¯é¤æ°å°ä¸åªå°ä¸ä½ï¼ä¸å¤å°±è¡¥0ï¼
ï¼3ï¼å°è¿ä¸ªæ ¡éªç éå¨åmä½æ°æ®åé¢ï¼æææ°çM+K-1ä½æ°æ®ï¼åéç»æ¥æ¶ç«¯ã
ï¼4ï¼æ¥æ¶ç«¯å°æ¥æ¶å°çæ°æ®é¤ä»¥æ åé¤æ°ï¼å¦æä½æ°ä¸º0å认为æ°æ®æ£ç¡®ã
注æï¼ CRCæ ¡éªä¸æä¸¤ä¸ªå ³é®ç¹ï¼ä¸æ¯è¦é¢å ç¡®å®ä¸ä¸ªåé端åæ¥æ¶ç«¯é½ç¨æ¥ä½ä¸ºé¤æ°çäºè¿å¶æ¯ç¹ä¸²ï¼æå¤é¡¹å¼ï¼ï¼äºæ¯æåå§å¸§ä¸ä¸é¢éå®çé¤è¿è¡äºè¿å¶é¤æ³è¿ç®ï¼è®¡ç®åºFCSãåè å¯ä»¥éæºéæ©ï¼ä¹å¯æå½é ä¸éè¡çæ åéæ©ï¼ä½æé«ä½åæä½ä½å¿ é¡»å为â1â
å®ä¾ï¼å¯¹äºæ°æ®ï¼#B3ï¼ï¼ä»¥æå®é¤æ°æ±å®çCRCæ ¡éªç ï¼å ¶è¿ç¨å¦ä¸ï¼
å ³äºæ ¡éªç ç计ç®ï¼éç¹æ¥äºï¼
å纯è°CRCç模2é¤æ³å ¶å®å¹¶ä¸å°é¾ï¼ä½å®é 计ç®ä¸ç»å¸¸ä¼éå°è®¡ç®åºæ¥çç»æåå®é ä¸ä¸è´çæ åµï¼è¿ä¹æ¯è¿å 天æå¨ççä¸è¥¿ã
è¿ééè¦ç¥éå 个ç»æé¨åæè 说计ç®æ¦å¿µï¼å¤é¡¹å¼å ¬å¼ãå¤é¡¹å¼ç®è®°å¼ãæ°æ®å®½åº¦ãåå§å¼ãç»æå¼æå¼ãè¾å ¥å¼å转ãè¾åºå¼å转ãåæ°æ¨¡åã
1ãå¤é¡¹å¼å ¬å¼
对äºCRCæ åé¤æ°ï¼ä¸è¬ä½¿ç¨å¤é¡¹å¼ï¼æäºé¡¹å¼ï¼å ¬å¼è¡¨ç¤ºï¼å¦ä¸ä¾ä¸é¤æ°çäºé¡¹å¼ä¸ºG(X)=X4+X3+X+1ï¼Xçææ°å°±ä»£è¡¨äºè¯¥bitä½ä¸çæ°æ®ä¸º1,ï¼æä½ä½ä¸º0ï¼ãè¿éç¹å«æ³¨æä¸ä¸ä½æ°é®é¢ï¼é¤æ°çä½æ°ä¸ºäºé¡¹å¼æé«æ¬¡å¹+1ï¼4+1=5ï¼ï¼è¿ä¸ªå¾éè¦ã
2ãå¤é¡¹å¼ç®è®°å¼
éè¿å¯¹CRCçåºæ¬äºè§£æ们ç¥éï¼å¤é¡¹å¼çé¦å°¾å¿ å®ä¸º1ï¼èè¿ä¸ª1çä½ç½®å¨ä¸ä¸æ¥è®¡ç®ä¸å®ä¸º0ï¼æ以就æåé¢è¿ä¸ª1ç»çç¥æäºï¼åºç°äºä¸ä¸ªå«ç®è®°å¼çä¸è¥¿ï¼å¦ä¸ä¾ä¸é¤æ°çç®è®°å¼ä¸ºï¼å¾å¤çè¿CRCé«çº§è¯è¨æºç ç人ä¼ç¥éï¼å¯¹äºCRC_æ åä¸G(X)=X+X+X2+1ï¼#ï¼çpolyå¼å®é ä¸æ¯ï¼è¿é使ç¨çå°±æ¯ç®è®°å¼ãåé¢ä¼å¯¹è¿ä¸ªç¨æ³åä¸ä¸ªè¯´æã
3ãæ°æ®å®½åº¦
æ°æ®å®½åº¦æçå°±æ¯CRCæ ¡éªç çé¿åº¦ï¼äºè¿å¶ä½æ°ï¼ï¼ç¥éäºCRCçè¿ç®æ¦å¿µåå¤é¡¹å¼ï¼å°±å¯ä»¥ç解è¿ä¸ªæ¦å¿µäºï¼CRCé¿åº¦å§ç»è¦æ¯é¤æ°ä½æ°å°1ï¼ä¸ç®è®°å¼é¿åº¦æ¯ä¸è´çã
以ä¸ä¸ä¸ªæ°æ®å°±æ¯æ们ç»å¸¸è½å¤ç¨å°çåºæ¬æ°æ®
4ãåå§å¼ä¸ç»æå¼æå¼
å¨ä¸äºæ åä¸ï¼è§å®äºåå§å¼ï¼åæ°æ®å¨è¿è¡ä¸è¿°äºé¡¹å¼è¿ç®ä¹åï¼éè¦å å°è¦è®¡ç®çæ°æ®ä¸åå§å¼çæä½åèè¿è¡å¼æï¼ç¶ååä¸å¤é¡¹å¼è¿è¡è®¡ç®ã
èå¨ç»æå¼æå¼ä¸ä¸ºé¶çæ åµä¸ï¼åéè¦å°è®¡ç®å¾å°çCRCç»æå¼åä¸ç»æå¼æå¼è¿è¡ä¸æ¬¡å¼æ计ç®ï¼å¾å°çæç»å¼ææ¯æ们éè¦çCRCæ ¡éªç ã
è¿éå¯ä»¥çåºï¼åå§å¼ä¸ç»æå¼çä½æ°è¦æ±ä¸æ°æ®å®½åº¦ä¸è´ã
5ãè¾å ¥å¼å转ä¸è¾åºå¼å转
è¾å ¥å¼å转çæææ¯å¨è®¡ç®ä¹åå å°äºé¡¹å¼å转ï¼ç¶ååç¨å¾å°çæ°å¼åæ°æ®è¿è¡è®¡ç®ãå¦å¯¹äºG(X)=X+X+X2+1ï¼#ï¼ï¼å ¶æ£åå¼ä¸º1 ï¼å转å¼å为 1
è¾åºå¼å转åæ¯å°æç»å¾å°çCRCç»æå转ã
é常ï¼è¾å ¥å¼å转åçç»æå¼ä¹ä¼æ¯å转çï¼æ以è¿ä¸¤ä¸ªé项ä¸è¬æ¯ååçï¼æ们åªæå¨å¨çº¿CRC计ç®å¨ä¸ä¼çå°èªç±éæ©æ£å转çæ åµåå¨ã
é£ä¹ï¼è¿éå¼ç¨CSDNå主 bobde çä¸æ®µæ»ç»ï¼
CRCãCRCçå¤åèçæ ¡éªå¼ç计ç®æå ç¹éè¦æ¸ æ¥ï¼åªé对ä¸æ¬¡ä¸ä¸ªåèçç®æ³ï¼ï¼
1) åå§å¼ä¸ä¸º0çæ åµä¸ï¼è¯¥å¦ä½è®¡ç®ï¼
è¾å ¥æ°æ®éè¦å转ï¼å å°è¦è®¡ç®çæ°æ®ä¸åå§å¼çæä½åèè¿è¡å¼æï¼åä¸å转åçå¤é¡¹å¼è¿è¡è®¡ç®ã
è¾å ¥æ°æ®ä¸éè¦å转ï¼å å°è¦è®¡ç®çæ°æ®å·¦ç§»å°ä¸åå§å¼å¯¹é½çä½ç½®ï¼å¦CRCç®æ³ï¼å左移8ä½ï¼ä½ä½å¡«å 0ï¼å¦CRCç®æ³ï¼å左移ä½ï¼ä½ä½å¡«å 0ï¼ä¸åå§å¼è¿è¡å¼æï¼åä¸æ£å¸¸çå¤é¡¹å¼è¿è¡è®¡ç®ã
2) ç»æå¼æå¼ä¸ä¸º0çæ åµï¼ç¬¬ä¸æ¥ç®å¾å°çCRCå¼åä¸ç»æå¼æå¼è¿è¡å¼ææä½å¾å°æç»çæ ¡éªå¼ï¼
è¾åºæ°æ®å转ï¼å¦æè¾å ¥æ°æ®æ¯å转ç模å¼ï¼åç»æä¹æ¯å转ç
è¾åºæ°æ®ä¸å转ï¼å¦æè¾å ¥æ°æ®æ¯ä¸å转ç模å¼ï¼åç»æä¹æ¯ä¸å转ç
3ï¼åå§å¼çéæ©æ¯å¯èªå·±å®ä¹ï¼å¾å¤ä¸åçå家使ç¨çåå§å¼æ¯ä¸ä¸æ ·ï¼ä¸ä¸æ ·çåå§å¼å¾å°çç»æä¹æ¯ä¸ä¸æ ·çã
---------------------
åæï¼/bobde/article/details/
ä¸åçäºé¡¹å¼ãåå§å¼ãç»æå¼æå¼ãå转ååé½ä¼é ææç»çç»æä¸ä¸è´ï¼è¿å°±æ¯ä¸ºä»ä¹æææ¯æ£ç¡®ç计ç®æ¹å¼ï¼ææ¶åç®åºæ¥çç»æå´æ»æ¯ä¸æ£ç¡®ã
é£ä¹ï¼å¦ä½å»å¤æåºè¯¥éç¨åªäºååå¢ï¼è¿éè°å°æåä¸ä¸ªæ¦å¿µï¼
6ãåæ°æ¨¡å
è½ç¶CRCå¯ä»¥ä»»æå®ä¹äºé¡¹å¼ãæ°æ®é¿åº¦çï¼ä½æ²¡æä¸ä¸ªç»ä¸çæ åçè¯ï¼å°±ä¼è®©æ´ä¸ªè®¡ç®åå¾é常ç麻ç¦ãä½å®é ä¸ï¼ä¸åçå家ç»å¸¸éç¨ä¸åçæ åç®æ³ï¼è¿éååºäºä¸äºå½é 常ç¨ç模å表ï¼
以ä¸ä¸ºå ³äºCRCçç¬è®°ï¼ä¸ä¸ç¯è®²ä¸è®²é«çº§è¯è¨å®ç°æè·¯
CRC-8和CRC-算法
在汽车通信系统中,CRC校验是代码确保数据传输准确性的关键技术。以CRC8为例,算源算法它作为XOR校验的代码升级,主要用于检测报文中的算源算法ssr后端源码错误。发送前,代码会通过Rolling counter和Checksum进行校验,算源算法Rolling counter用于检测丢帧,Checksum(如CRC8)则确保同一时刻的报文无误。
CRC8的原理是,发送端根据报文生成一个1字节的安装 源码包校验码,使用特定的生成多项式,如g(x)=1·x^8+0·x^7+0·x^6+1·x^5+1·x^4+0·x^3+0·x^2+0·x^1+1·x^0,转换为二进制即0x。接收端使用相同的生成多项式进行校验,若计算结果与接收到的校验码相符,就确认数据传输正确。网页 源码 看板
报文编码有Intel和Motorola两种格式,影响了字节的排列顺序。CAN报文按照高位MSB到低位LSB的顺序发送。举例来说,传输车速0x,Motorola编码方式会把高位放在低字节的静态源码后门高位,Intel编码则相反。
计算CRC8时,先将数据左移8位,然后逐位与生成多项式的二进制形式进行异或运算。对于每个字节,可能需要进行多次判断、移位和异或操作。使用查表法可以简化计算,预先计算所有字节的CRC结果,查询时直接获取,大大减少计算量。
CRC是CRC校验的另一种版本,它有多种标准,如CRC_CCITT、CRC_XMODEM等,尽管原理相似,但在数据输入和输出的处理方式上有所区别。CRC的计算流程通常包括选择初值、异或数据、根据最高位移位和异或多项式、重复处理所有输入数据,最终生成位校验码。
总的来说,CRC校验是通过复杂的算法保证数据传输的准确性和完整性,不同的版本(如CRC8和CRC)在计算细节和标准上有所差异,但核心原理是一致的。如果你对这些算法感兴趣,可以关注汽车控制与人工智能微信公众号获取更详细的源码资料。