[C语言]模拟人工计算CRC校验码
组成原理课程设计要实现CRC码的生成与校验,然而并不会用硬件实现...
只好先用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类写,就不用整这些数组了...