ç¨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-8和CRC-算法
在汽车通信系统中,CRC校验是代码确保数据传输准确性的关键技术。以CRC8为例,讲解它作为XOR校验的标准升级,主要用于检测报文中的代码错误。发送前,讲解gohttp源码会通过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。代码接收端使用相同的讲解eclipse ctrl查看源码生成多项式进行校验,若计算结果与接收到的校验码相符,就确认数据传输正确。
报文编码有Intel和Motorola两种格式,影响了字节的排列顺序。CAN报文按照高位MSB到低位LSB的顺序发送。举例来说,传输车速0x,linux eclipse 查看源码Motorola编码方式会把高位放在低字节的高位,Intel编码则相反。
计算CRC8时,先将数据左移8位,然后逐位与生成多项式的二进制形式进行异或运算。对于每个字节,可能需要进行多次判断、移动积分钓鱼源码移位和异或操作。使用查表法可以简化计算,预先计算所有字节的CRC结果,查询时直接获取,大大减少计算量。
CRC是CRC校验的另一种版本,它有多种标准,php源码 图片相册如CRC_CCITT、CRC_XMODEM等,尽管原理相似,但在数据输入和输出的处理方式上有所区别。CRC的计算流程通常包括选择初值、异或数据、根据最高位移位和异或多项式、重复处理所有输入数据,最终生成位校验码。
总的来说,CRC校验是通过复杂的算法保证数据传输的准确性和完整性,不同的版本(如CRC8和CRC)在计算细节和标准上有所差异,但核心原理是一致的。如果你对这些算法感兴趣,可以关注汽车控制与人工智能微信公众号获取更详细的源码资料。
CRC校验算法源码(易语言)
CRC校验算法源码在易语言中的实现如下:
版本 2
子程序 _CRC校验计算, 参数 预校验内容, 预校验内容为字节型数组
局部变量 crc, 用于存储校验值,初始值为 "2"
局部变量 返回数据, 用于存储最终的校验值,类型为整数型
局部变量 j, 用于数组索引,类型为整数型
局部变量 被校验内容, 用于存储数组中的每个字节,类型为字节型
局部变量 i, 用于循环计数,类型为整数型
局部变量 CY, 用于判断当前位是否为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低位)
位的CRC检验码的VHDL程序 怎么写?
最简单的方式:上网下载源码。
一点建议:还是找本基础的VHDL书先看看语法吧,不然下载了源码你也看不懂。不用把VHDL看的很难,跟C语言很像的,只要有点C语言的基础,学习起来都不难。当然,如要成高手,自然还是要付出努力。
2024-12-26 13:56
2024-12-26 13:47
2024-12-26 13:43
2024-12-26 13:40
2024-12-26 13:26