#include<stdio.h>
#include <string.h>
//该程序中二进制数用字符串表示,比如二进制的110就用"110"表示
//该函数完成二进制数的异或
//result保存异或的结果,s1和s2为两个二进制串
char* strxor(char *result, const char *s1, const char *s2)
{
int i=0;
while(s1[i] && s2[i]){
if(s1[i] != s2[i]){ //相异的时候为1
result[i] = '1';
}
else{ //相同则为0
result[i] = '0';
}
++i;
}
result[i] = '\0'; //字符串结束
return result;
}
//将字符串左移一位
//传入字符串本身,返回字符串本身
char* strlmv(char *s)
{
int i=0;
while(s[i]){
s[i] = s[i+1]; //前一个等于后一个
++i;
}
return s;
}
//该函数完成模2除法
//传入参数:被除数 除数 保存商的空间 保存余数的空间
void strm2div(const char *strM, const char *strP, char *strQ, char *strR)
{
int lM = strlen(strM); //被除数的长度
int lP = strlen(strP); //除数的长度
int L = lM+lP; //被除数和除数的总长
int i; //循环需要的
char *sM = new char[L+1]; //使用sM替换被除数,前lM个值为除数本身,后lP个值用0补上
for(i=0; i<L; ++i){
if(i<lM){ //前lM个值为除数本身
sM[i] = strM[i];
}
else{ //后lP个值用0补上
sM[i] = '0';
}
}
sM[i] = '\0'; //字符串结束
strncpy(strR, sM, lP); //一开始余数照搬被除数
strR[lP] = '\0'; //字符串结束
for(i=0; i<lM; ++i){
if(strR[0]=='1'){ //如果余数最高位为1
strxor(strR, strR, strP); //余数与除数做异或,异或后的值直接更新到余数
strQ[i] = '1'; //商1
}
else{ //如果余数高位为0
//这里应该是与lP个0做异或,因为和0做异或等于本身,因此略去
strQ[i] = '0'; //商0
}
strlmv(strR); //把余数左移(最高位丢弃)
strR[lP-1] = sM[lP+i]; //在末尾补上对应的被除数位
strR[lP] = '\0'; //字符串结束
}
strR[lP-1] = '\0'; //余数只取前lP-1位(比除数P少一位)
strQ[i] = '\0'; //字符串结束
delete sM; //回收空间
}
//该函数输出CRC4的帧检验序列
//传入待传送的数据strM 帧检验序列保存的空间
//返回帧检验序列
char *crc4(const char *strM, char *fcs)
{
char *tmQ = new char[strlen(strM)+1];
strm2div(strM, "10011", tmQ, fcs); //使用模2计算的方式求出FCS,带传送数据/10011再取余数
return fcs;
}
//CRC4校验演示
void main()
{
char inbuf[100], fcs[100]; //输入缓冲区 FCS缓冲区
int i=0,j=0;
printf("\n输入M:");
scanf("%s",inbuf);
while(inbuf[0]!='0' || inbuf[1]!='\0'){
printf("FCS:");
puts(crc4(inbuf, fcs));
printf("校验帧:");
strcat(inbuf,fcs);
puts(inbuf);
crc4(inbuf, fcs);//检验
for(i=0;i<100;i++){
if(fcs[i]==1) j++;
}
printf("检验结果:"); printf("%d Error!\n",j);
printf("输入M:");
scanf("%s",inbuf);
}
}
CRC4校验C语言源码实现
最新推荐文章于 2021-06-23 10:04:32 发布