組成原理課程設計要實現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類寫,就不用整這些數組了...