#include <stdio.h>
#include <string.h>
// 转化后的二进制最多的位数
#define MAX_BIN_LENGHT 100
// 输入的表达式最多的字符数
#define MAX_EXP_LENGHT 100
// 根据表达式得到二进制数
void getBinary(char *express,int binary[MAX_BIN_LENGHT]);
// 根据两个二进制数,得到CRC校验结果
void getQuoRem(int *binaryY,int binaryG[MAX_BIN_LENGHT], int result[MAX_BIN_LENGHT]);
// 打印二进制数
void printBinary(int binary[MAX_BIN_LENGHT]);
// 得到正序的二进制数
void getOrderedBinary(int originalBinary[MAX_BIN_LENGHT],int orderedBinary[MAX_BIN_LENGHT]);
// 得到二进制位数
int getBinaryLength(int originalBinary[MAX_BIN_LENGHT]);
int main(int argc,char *argv[])
{
int binaryY[MAX_BIN_LENGHT]={0}; // 存放Y(x)转化后的二进制数
int binaryG[MAX_BIN_LENGHT]={0}; // 存放G(x)转化后的二进制数
int binaryTemp[MAX_BIN_LENGHT]={0}; // 存放表达式转化后的倒序二进制数
int binaryResult[MAX_BIN_LENGHT]={0}; // 存放最后要发送的加上校验码的数据
char express[MAX_EXP_LENGHT]; //存放输入的表达式
printf("请输入Y(x)表达式:\n");
scanf("%s",express);
getBinary(express,binaryTemp);
getOrderedBinary(binaryTemp,binaryY);
printf("请输入G(x)表达式:\n");
scanf("%s",express);
getBinary(express,binaryTemp);
getOrderedBinary(binaryTemp,binaryG);
// 得到有校验码的数据
getQuoRem(binaryY,binaryG,binaryResult);
printf("\nY(x)的二进制为:");
printBinary(binaryY);
printf("G(x)的二进制为:");
printBinary(binaryG);
printf("最终的CRC校验数据为:");
printBinary(binaryResult);
return 0;
}
/**********************
* 根据表达式得到二进制数
***********************/
void getBinary(char *express,int binary[MAX_BIN_LENGHT])
{
int i;
int num=0;
char tempc;
// 让binary清零
for(i=0;i<MAX_BIN_LENGHT;i++)
{
binary[i]=0;
}
// 求倒序的二进制
for(i=0;i<strlen(express);)
{
if(*(express+i)=='^')
{
// 如果是^号,表示接下来的就是指数了
for(i=i+1;i<strlen(express);i++)
{
tempc=*(express+i);
if(tempc>='0' && tempc<='9')
{
num=num*10+(tempc-'0');
if((i+1)>=strlen(express))
{
binary[num]=1;
}
}
else
{
/*
得到相应的指数,将对应的二进制位数设置为1。
此时二进制的最低位对应的是binary[0],二进制的最高位对应的是binary[MAX_BIN_LENGHT-1]
*/
binary[num]=1;
num=0;
break;
}
}
}
else
{
if(*(express+i)=='1'&& (i+1)>=strlen(express))
{
// 如果最后一个数字是1,那么二进制最低位binary[0]设置为1
binary[0]=1;
}
i++;
}
}
}
/**************************
* 根据两个二进制数,得到CRC校验结果
* 参数: binaryY 二进制被除数
* binaryG 二进制除数
* quotient 商
* remainder 余数
* result 带校验码的最终结果
**************************/
void getQuoRem(int binaryY[MAX_BIN_LENGHT],int binaryG[MAX_BIN_LENGHT],int result[MAX_BIN_LENGHT])
{
int i,j,index=0,k;
int lengthY,lengthG,lengthB;
int quotient[MAX_BIN_LENGHT]={0}; // 存放商的二进制数
int remainder[MAX_BIN_LENGHT]={0}; // 存放余数的二进制数
lengthY=getBinaryLength(binaryY);
lengthG=getBinaryLength(binaryG);
if(lengthG>lengthY)
{
printf("除数比余数大!无法得到正确商和余数!");
quotient[1]=-1;
remainder[1]=-1;
return ;
}
/*
* 将被除数的后边加上除数对应的0,结果存入到result中。
* 添加的0的个数与除数中x^n的最大指数值n相同
*/
for(i=0;i<(lengthY+lengthG-1);i++)
{
// 最终的结果前面与被除数相同
if(i<lengthY)
{
result[i]=binaryY[i];
}
// 最终结果的后面填充相应个数的0
else
{
result[i]=0;
}
}
// result尾部加上结束符
result[i]=-1;
// 得到被除数总的位数长度
lengthB=getBinaryLength(result);
// 先得到最开始的余数
for(i=0;i<lengthG;i++)
{
remainder[i]=result[i];
}
// 循环得到商和余数
for(i=lengthG-1;i<lengthB;i++)
{
if(remainder[0]==1)
{
// 商1
quotient[index]=1;
// remainder余数与除数按位异或,结果存remainder余数中
for(j=0;j<lengthG;j++)
{
if(remainder[j]==binaryG[j])
{
remainder[j]=0;
}
else
{
remainder[j]=1;
}
}
}
else
{
// 商0
quotient[index]=0;
// 商0的话,remainder余数与全0按位异或,余数结果是不变的
}
index++;
// 舍弃余数最高位,后边的依次前移1位
for(j=1;j<lengthG;j++)
{
remainder[j-1]=remainder[j];
}
// 将被除数的下一位数字加到余数的最低位处,这样就可以进行下一次的除法
if((i+1)<lengthB)
{
remainder[lengthG-1]=result[i+1];
}
}
// 循环结束,将商和余数的数组末尾加上结束符号
remainder[lengthG-1]=-1;
quotient[index]=-1;
/*
printf("商为:");
printBinary(quotient);
printf("余数为:");
printBinary(remainder);
*/
// 将被除数后面的0换成相应的余数,这样被除数就变成要发送的带校验码的数据
for(i=lengthY;i<(lengthY+lengthG-1);i++)
{
result[i]=remainder[i-lengthY];
}
}
/**************************
* 打印二进制数
**************************/
void printBinary(int binary[MAX_BIN_LENGHT])
{
int i;
for(i=0;i<getBinaryLength(binary);i++)
{
printf("%d",binary[i]);
}
printf("\n");
}
/**************************
* 得到正序的二进制数
**************************/
void getOrderedBinary(int originalBinary[MAX_BIN_LENGHT],int orderedBinary[MAX_BIN_LENGHT])
{
/*
*因为originalBinary数组中originalBinary[0]存放的是二进制的最低位,originalBinary[MAX_BIN_LENGHT-1]存放的是二进制的最高位,
*将数组倒序后存放到orderedBinary中
*/
int i;
int j=0;
for(i=MAX_BIN_LENGHT-1;i>=0;i--)
{
if(originalBinary[i]==1)
{
for(j=0;i>=0;i--)
{
orderedBinary[j]=originalBinary[i];
j++;
}
}
else if(i==0)
{
orderedBinary[j]=originalBinary[i];
j++;
}
}
// 设置结束标志
orderedBinary[j]=-1;
}
/**************************
* 得到二进制位数
**************************/
int getBinaryLength(int binary[MAX_BIN_LENGHT])
{
int i;
for(i=0;i<MAX_BIN_LENGHT;i++)
{
if(binary[i]==-1)
{
break;
}
}
return i;
}
/*-----------------------------测试结果------------------------------*/
请输入Y(x)表达式:
x^5+x^3+1
请输入G(x)表达式:
x^3+x^2+1
Y(x)的二进制为:101001
G(x)的二进制为:1101
最终的CRC校验数据为:101001001
分享到:
相关推荐
用C语言实现CRC校验计算 用C语言实现CRC校验计算是一种非常实用的方法,CRC(Cyclic Redundancy Check)是一种常用的数据容错方法,广泛应用于数据传输、数据压缩等领域。 CRC 的实现分为硬件和软件两种方法,而...
使用c语言模拟人工crc校验算法。使用c语言模拟人工crc校验算法。
在C语言中实现CRC校验时,需要关注的关键点包括数据的二进制运算、多项式的乘除法以及如何构建和使用查找表。实际的编码过程涉及到位操作,包括位移、异或等操作,因为它们是处理二进制数据的基本工具。在进行CRC...
### CRC校验C语言实现详解 #### 一、CRC校验概述 CRC(Cyclic Redundancy Check)校验是一种广泛应用于数据传输中的错误检测方法。它的主要目的是检测数据在传输过程中是否发生了改变,以此来确保数据的完整性和...
1. **CRC16算法**: CRC16是CRC校验的一种,使用16位的校验码。它基于二进制多项式除法,通常会指定一个16位的生成多项式。例如,常用的CRC16-CCITT(也称Kermit)生成多项式为`G(x) = x^16 + x^12 + x^5 + 1`,对应...
另外两个文件,`CRC校验码大全.mht`和`老古 CRC算法原理及C语言实现.mht`,很可能是HTML帮助文档或电子书,它们可能提供了更详细的CRC理论介绍,包括不同类型的CRC校验码(如CRC-8、CRC-16、CRC-32等),以及CRC算法...
C语言实现的CRC校验库使得在各种嵌入式系统和软件应用中能够方便地集成这种功能。下面我们将详细探讨CRC校验的基本原理、常用CRC参数模型以及如何用C语言实现这些模型。 **CRC基本原理** CRC校验的核心思想是通过...
在C语言中实现CRC校验涉及到对二进制数据进行特定的模2除法运算。 CRC的基本原理是,发送端将k位的原始数据加上r位的CRC码(生成多项式的逆元),形成一个(k+r)位的传输数据。接收端同样根据生成多项式计算校验码并...
4. "CRC校验C语言实现.pdf":提供了CRC校验在C语言中的具体实现方式,可能包括代码示例和详细步骤。 5. "crc校验原理.pdf":另一份关于CRC校验基础理论的PDF文档,可能与"crc校验原理.doc"有所重叠,但可能提供了...
32位CRC校验c语言代码,参数:内容,长度,种子值,直接调接口即可使用。
C语言实现CRC校验,可以有效地在各种平台上运行,并且代码效率高,占用资源少。 在标签中,"checksum"指的是校验和,它是另一种简单的错误检测方法,通常用于检查数据的完整性和一致性。虽然CRC比校验和更复杂,但...
总之,CRC校验是数据通信领域中一个重要的错误检测工具,通过理解其工作原理并掌握C语言实现方法,可以有效地保护数据的完整性和可靠性。在实际应用中,可以根据具体需求选择不同的CRC标准,如CRC-8、CRC-16、CRC-32...
CRC8算法基于二进制多项式除法,通过将数据看作是一个二进制数,然后用一个预定义的生成多项式进行除法运算,得到的余数即为CRC校验码。 在这个“CRC8.rar”压缩包中,包含了一个使用C语言实现的CRC8校验程序。...
海明码和CRC校验的C语言实现 海明码(Hamming Code)是一种 Error-Correcting Code,用于检测和纠正数字通信中的错误。它是由理查德·汉明(Richard Hamming)在1947年提出的一种编码方法。海明码的基本思想是加入...
### C语言实现CRC16校验 #### 一、CRC简介及原理 ...通过以上介绍,我们不仅了解了CRC校验的基本原理,还掌握了使用C语言实现CRC16校验的具体方法。这对于从事数据通信及相关领域的技术人员来说是非常有用的。
在C语言中实现CRC校验码的生成,通常涉及到位操作、移位以及一个预定义的CRC查找表。以下是CRC校验码生成的基本原理和C语言源代码的解析。 1. **CRC基本原理**: - CRC校验通过计算数据块的“余数”来检查数据的...
C语言实现CRC16校验
CRC校验原理及其C语言实现,是数据通信与存储领域中一种重要的错误检测技术,用于确保数据在传输过程中的完整性和准确性。CRC(Cyclic Redundancy Check)校验码是一种基于多项式除法的检错机制,通过在数据后面附加...