首页 > 代码库 > [C语言]模拟人工计算CRC校验码

[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类写,就不用整这些数组了...

 

[C语言]模拟人工计算CRC校验码