CRC循环冗余校验码的C语言实现
2023-09-14 09:16:18 时间
CRC原理
计算方式如下图所示,若除数为n位,待校验的数据为k位,则先在待校验的数据后面添加n-1个0,然后再和除数进行模2除法,所谓模2除法,其实就是将竖式运算中的减法改为异或运算。
C代码实现
#include <iostream>
#include<stdio.h>
using namespace std;
int P[4]={1,0,1,1};
void XOR(int a[4],int b[4]){
for(int i=0;i<4;i++){
if(a[i]==1){
if(b[i]==1){
a[i]=0;
}
else{
a[i]=1;
}
}
else{
if(b[i]==0){
a[i]=0;
}
else{
a[i]=1;
}
}
}
}
void print_result(int a[4]){
printf("result:\n");
for(int i=3;i>=0;i--){
printf("%d ",a[i]);
}
printf("\n");
}
void crc(int X[9],int FCS[3]){
int result[4];
int t=4;
for(int i=0;i<4;i++){
result[i]=X[9-(4-i)];
}
XOR(result,P);
print_result(result);
while(1){
printf("t=%d,shift\n",t);
for(int i=4-1;i>=1;i--){
result[i]=result[i-1];
}
result[0]=X[t--];
if(result[3]==1){
XOR(result,P);
}
else{
;//和0000异或,即恒等运算
}
//print result
print_result(result);
if(t<0){
for(int i=0;i<3;i++){
FCS[i]=result[i];
}
break;
}
}
}
int main()
{
int X[9]={0,0,0,1,0,0,1,0,1}; //结果应为001
int Y[9]={0,0,0,0,1,1,0,1,1}; //结果应为111
int FCS[3];
crc(Y,FCS);
//
cout<<"final result=";
cout <<FCS[2]<<" "<<FCS[1]<<" "<<FCS[0]<<endl;
return 0;
}
相关文章
- C语言学习——结构体_联合体_枚举用法直通[通俗易懂]
- C语言学生成绩管理系统(设计报告和全部源码)「建议收藏」
- C语言编写一个计算器(附全源代码)「建议收藏」
- 选择排序——C语言代码
- 【C语言】——背包问题详解「建议收藏」
- C语言课程设计图书管理系统_大一c语言课程设计模板
- C语言实现顺序栈相关操作
- 二叉树遍历——递归链式(C语言实现)
- 栈和队列(C语言实现)
- 【初级】C语言——分支和循环语句(2)
- 搭建Linux下的C语言开发环境(linux下c开发环境)
- while循环,C语言while循环详解
- C语言历史,C语言与UNIX系统的关系
- 探索C语言、Linux开发环境新体验(clinux开发环境)
- MySQL中使用C语言处理长连接的技巧(c mysql长连接问题)
- 开发效率C语言与MySQL结合提升开发效率(c mysql增加)
- 快速搭建Oracle数据库连接,C语言编程实践(c oracle连接库)
- C语言使用普通循环方法和递归求斐波那契序列示例代码