模拟实现CRC校验算法课程设计代码(C语言)
生活随笔
收集整理的這篇文章主要介紹了
模拟实现CRC校验算法课程设计代码(C语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寰寰閑話:
相關原理解釋csdn里面賊多,好多博主講的賊棒,所以我就單純就課程設計來說一說,所實現的功能分兩部分就是得到CRC校驗碼的發送比特序列以及校驗過程。所以在寫的時候當成兩個函數就好啦。話不多說,直接擼代碼!
代碼如下
#include <stdio.h> #include <math.h>int count(int); void sc();//生成函數 bool jy();//校驗函數int main() {printf("請輸入你的選擇:\n1--生成CRC校驗碼\n2--校驗對錯\n");int choose = 0;scanf("%d",&choose);switch (choose){case 1:sc();break;case 2:if(jy()){printf("傳輸過程正確\n");}else{printf("傳輸過程錯誤\n");}break;default:break;}return 0; }int count(int num)//計算位數 {unsigned int a, b = 0; /*計算生成碼的長度m*/a = num;do{a >>= 1;//每移一位,位數加1,直到最高位為0b++;} while (a != 0);return b; }void sc() {unsigned int gx, fx, m, n, z;printf("以下數據以十六進制計數方式輸入\n");printf("請輸入生成碼的值:\n");scanf("%x", &gx);printf("請輸入信息碼的值:\n");scanf("%x", &fx);m = count(gx);//gx的位數n = count(fx);//fx位數fx <<= m - 1; /*信息碼左移m-1位,求出擴展列,即fx*(gx的最高次冪的位數)*/unsigned int ffx;//拷貝一個fxffx = fx;for (int i = m + n - 1; i >= m; i--){if ((ffx >> (i - 1)) == 0)//相與直到為0continue;unsigned int tmp = 0xffffffff;//32位tmp <<= (32 - i);tmp >>= (32 - i); //高位清0ffx &= tmp; //保留ffx的低位ffx ^= (gx << (i - m));//減去是gx的位數}ffx &= (0xffffffff << 32 - (m - 1)) >> (32 - (m - 1)); //高位清0z = ffx | fx;printf("輸出CRC校驗碼比特序列R(x)=0x%x", ffx);printf("\n");printf("輸出帶CRC校驗碼的發送數據比特序列為0x%x\n", z); }bool jy() {unsigned int gx, fx, m, n, z;printf("以下數據以十六進制計數方式輸入\n");printf("請輸入生成碼的值:\n");scanf("%x", &gx);printf("請輸入待校驗數據:\n");scanf("%x", &fx);m = count(gx);n = count(fx);unsigned int ffx;ffx = fx;for (int i = n; i >= m; i--){if ((ffx >> (i - 1)) == 0)continue;unsigned int tmp = 0xffffffff;tmp <<= (32 - i);tmp >>= (32 - i); //高位清0ffx &= tmp; //保留ffx的低位ffx ^= (gx << (i - m));}if(ffx == 0){return true;}else{return false;}}解釋說明:想實現循環輸入,在main函數里加個while(1)就好啦。校驗函數里面的fx代表的意思就是待校驗的CRC碼,因為整個算法主要就是多項式除的過程,這里運用移位來進行模擬除的過程,就是這個算法,兩個相除。
for (int i = m + n - 1; i >= m; i--){if ((ffx >> (i - 1)) == 0)//相與直到為0continue;unsigned int tmp = 0xffffffff;//32位tmp <<= (32 - i);tmp >>= (32 - i); //高位清0ffx &= tmp; //保留ffx的低位ffx ^= (gx << (i - m));//減去是gx的位數}有需要的同學可以參考這個過程,進而寫出符合要求的課程設計!有什么問題可以評論留言,再給大家解答,也可以關注一哈我?!
總結
以上是生活随笔為你收集整理的模拟实现CRC校验算法课程设计代码(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小可用ID
- 下一篇: 基于ArcGIS和fragstats软件