[C语言]模拟人工计算CRC校验码
2016-12-21 19:43
295 查看
组成原理课程设计要实现CRC码的生成与校验,然而并不会用硬件实现...
只好先用C写着玩玩,做题还能用上...网原要考的...
例题:要发送的数据为1101011011,CRC生成多项式P(X)=X4+X+1,求应添加在数据后面的余数。
笔算过程:
编程算:
附上小白的代码...
C++可以用bitset类写,就不用整这些数组了...
只好先用C写着玩玩,做题还能用上...网原要考的...
例题:要发送的数据为1101011011,CRC生成多项式P(X)=X4+X+1,求应添加在数据后面的余数。
笔算过程:
编程算:
附上小白的代码...
1 #include "stdafx.h" 2 #define DATABIT_LENGTH 10 //数据位数 3 #define GENERATOR_LENGTH 5 //生成多项式位数 4 #define DATACRC_LENGTH DATABIT_LENGTH+GENERATOR_LENGTH-1 5 6 int main() 7 { 8 int dataBit[DATABIT_LENGTH]; //数据 9 int crcBit[GENERATOR_LENGTH - 1]; //余数 10 for (int i = 0; i < GENERATOR_LENGTH - 1; i++) //余数初始化为0 11 { 12 crcBit[i] = 0; 13 } 14 int generator[GENERATOR_LENGTH] = {1,0,0,0,1}; //初始化生成多项式 15 printf("输入生成多项式:"); 16 for (int i = 0; i < GENERATOR_LENGTH; i++) 17 { 18 scanf("%d", &generator[i]); 19 } 20 for (int i = 0; i < DATABIT_LENGTH; i++) //初始化要传送的数据 21 { 22 dataBit[i] = 0; 23 } 24 printf("输入数据计算校验位:"); 25 for (int i = 0; i < DATABIT_LENGTH; i++) 26 { 27 scanf("%d",&dataBit[i]); 28 } 29 int datacrc[DATACRC_LENGTH]; //数据后面补0 30 for (int i = 0; i < DATACRC_LENGTH; i++) 31 { 32 if (i < DATABIT_LENGTH) 33 { 34 datacrc[i] = dataBit[i]; 35 } 36 else 37 datacrc[i] = 0; 38 } 39 int crctmp[GENERATOR_LENGTH]; //模2运算过程中的“被减数”,“减数”是生成多项式 40 for (int i = 0; i < GENERATOR_LENGTH; i++) 41 { 42 crctmp[i] = -1; //被减数最开始让每一位都是-1 43 } 44 int p = 0; 45 for (int i = p; i < DATACRC_LENGTH; i++) 46 { 47 if (crctmp[0] == -1) 48 { 49 for (int k = 0; k < GENERATOR_LENGTH - 1; k++) 50 { 51 crctmp[k] = crctmp[k + 1]; //如果被减数第一位是-1的话,就左移一位,右边空出一位。 52 } 53 crctmp[GENERATOR_LENGTH - 1] = datacrc[i]; //空出的一位从上面读一个数下来 54 } 55 if(crctmp[0] != -1) //啥时候第一位不是-1了 56 { 57 // printf("读到"); 58 for (int j = 0; j < GENERATOR_LENGTH; j++) //证明读到一个长度和生成多项式一样长的数了,可以做模2运算了。 59 { 60 printf("%d ", crctmp[j]); //输出被减数 61 } 62 printf("\n"); 63 for (int j = 0; j < GENERATOR_LENGTH; j++) 64 { 65 printf("%d ", generator[j]); //输出减数 66 } 67 printf("\n"); 68 printf("\n"); 69 // printf("算\n"); 70 for (int j = 0; j < GENERATOR_LENGTH; j++) 71 { 72 crctmp[j] = crctmp[j] ^ generator[j]; //按位异或得到结果 73 } 74 for (int j = 0; j < GENERATOR_LENGTH;j++) 75 { 76 if (crctmp[j] == 1) 77 break; 78 crctmp[j] = -1; //把上面的结果前面几个0换成-1,循环回去继续读数。 79 } 80 } 81 //for (int j = 0; j < GENERATOR_LENGTH; j++) 82 //{ 83 // printf("%d ", crctmp[j]); 84 //} 85 //printf("\n"); 86 } 87 for (int i = 1; i < GENERATOR_LENGTH; i++) 88 { 89 if (crctmp[i] != -1&&crctmp[i]!=0) //被除数都落下来了后,得到余数,存到crcBit里。 90 crcBit[i-1] = 1; 91 } 92 printf("余数:"); 93 for(int i = 0; i < GENERATOR_LENGTH-1; i++) 94 { 95 printf("%d", crcBit[i]); 96 } 97 getchar();getchar(); 98 return 0; 99 }
C++可以用bitset类写,就不用整这些数组了...
相关文章推荐
- C语言 大整数乘法,模拟人工计算
- C语言计算数组的元素和(帮助理解指针)
- C语言学习--类的模拟
- 【c语言】 模拟实现printf,要求功能: my_printf("dc\ts\ndc\ndc\ts!", ...)
- 用C语言模拟用户登录情景,并且只能登录三次
- n阶行列式计算----c语言实现(完结)
- C语言中的类模拟(C++编程思想)
- 蓝桥杯之恶心的模拟题(计算日期)
- 计算单词出现的频率C语言实现的
- C语言-模拟实现strcat
- 栈模拟式子的计算
- C语言计算文件的md5值
- 科学计算——概率统计计算机模拟——Python
- 操作系统的进程管理(c语言模拟)
- [C语言]可变参数列表和简单模拟实现printf
- C语言模拟试题1
- C语言:模拟实现memmove
- C语言计算 最大公约数
- C语言如何计算程序运行时间
- 实验数据:将甲醛和亚硝酸的模拟分子网络分别计算100次的结果