當前位置:首頁 » 網路連接 » 計算機網路crc實驗用c實現
擴展閱讀
企鵝系統網路設置 2024-11-18 18:46:34
電腦兩邊黑屏咋整 2024-11-18 18:46:30

計算機網路crc實驗用c實現

發布時間: 2022-03-08 09:03:55

Ⅰ 用C語言實現CRC編碼程序

#include <stdio.h>
#include <string.h>
#include "stdlib.h"
unsigned int char2int(char *str)
{
unsigned int count=0, ret=0;
for(count = 0; count<strlen(str);count++)
{
ret = ret<<1;
if('0' != str[count])
{ ret+=1;}
}
return ret;
}

unsigned int getR(char *str)
{
unsigned int c =0 ;
int ret = strlen(str)-1;
for(c=0;c < strlen(str);c++)
{if(str[c] != '0')<br/> {return ret-c;}
}
}

int getRi(unsigned int num)
{
int c =0;
for(;num != 0; c++)
{num = num>>1;}
return c;
}

void CRC(char *scode, char *p, char*g )
{
unsigned int iP = char2int(p);
unsigned int iG = char2int(g);
unsigned int r= getR(g);
unsigned int code = iP << r;
unsigned int yx = code;
for(;getRi(yx) >= getRi(iG);)
{ yx = yx ^ (iG<<(getRi(yx) - getRi(iG)));}
code += yx;
itoa(code,scode,2);
}

void main() //定義主函數
{
char data[8]="" , bds[8]="",code[16]="";
printf("數據:");
scanf("%s", data);
printf("表達式:");
scanf("%s", bds);
CRC(code,data,bds);
printf("編碼:%s",code);
}

Ⅱ 演算法上機實驗如圖所示,用c語言實現

#include<stdio.h>

#include<stdlib.h>

struct node {

int data;//數據域

struct node *R;//左孩子

struct node *L;//右孩子

};

int a[] = {1, 2, 3, -1, -1, -1, 4, 5,7,-1,-1,-1,6,-1,-1};//二叉樹序列

int k = 0;

node* buildTree(node *tree) {//創建二叉樹

int data=a[k++];//

if (data== - 1) {//-1代表空結點

tree = NULL;

}

else {//非空結點

tree = (node*)malloc(sizeof(node));//分配內存

tree->data = data;//數據域賦值

tree->L = tree->R = NULL;//左右孩子賦空

tree->L=buildTree(tree->L);//前往左孩子

tree->R=buildTree(tree->R);//前往右孩子

}

return tree;//返回根結點地址

}

void dfs1(node *tree) {//前序遍歷

if (tree) {

printf("%d ", tree->data);

dfs1(tree->L);

dfs1(tree->R);

}

}

void dfs2(node *tree) {//中序

if (tree) {

dfs2(tree->L);

printf("%d ", tree->data);

dfs2(tree->R);

}

}

void dfs3(node *tree) {//後序

if (tree) {

dfs3(tree->L);

dfs3(tree->R);

printf("%d ", tree->data);

}

}

void level(node *tree){

//層次遍歷,類似與bfs(廣度優先搜索)

//需要一個隊列作為輔助數據結構

node* q[100];//隊列

int f=0,r=0;//頭,尾指針

q[r++]=tree;//根結點入隊

while(f!=r){

node *t=q[f++];//出隊

printf("%d ",t->data);//輸出

if(t->L!=NULL){//非空左孩子入隊

q[r++]=t->L;

}

if(t->R!=NULL){//非空右孩子入隊

q[r++]=t->R;

}

}

}

int count(node *tree){

if(tree==NULL){

return 0;

}

else{

int n,m;

n=count(tree->L);//左子樹結點個數

m=count(tree->R);//右子樹結點個數

return n+m+1;//返回左右子樹結點個數之和

}

}

int main() {

node *tree = NULL;

tree=buildTree(tree);

printf(" 前序遍歷: ");

dfs1(tree);

printf(" 中序遍歷: ");

dfs2(tree);

printf(" 後序遍歷: ");

dfs3(tree);

printf(" 層次遍歷: ");

level(tree);

printf(" 二叉樹結點個數:%d",count(tree));

return 0;

}

Ⅲ 用C++或C語言編一個CRC校驗程序

演算法忘了,要不就幫你寫了

Ⅳ 大俠給我個完整的crc 程序 用C語言實現的,能在PC機上運行的。我馬上拿出100分。。。

樓主程序中調用函數cal_crc()的方式不正確。函數cal_crc()用於計算輸入串的校驗碼,因此函數輸入參數包含輸入串及該串的長度。
建議將main()函數修改為:
#include <string.h>
void main()
{
unsigned char buf[] = "ABCDEFG1234567"; // 輸入串
unsigned char len = 14; // 輸入串的長度
unsigned int crc;
crc = cal_crc(buf, len);
}

最後需要注意的是,輸入串的長度不能大於256個位元組。上述例子程序中假定了輸入串為字元串,實際上,還可以是位元組串,此時變數len表示位元組串的包含的位元組個數。

Ⅳ 求一個C語言實現的CRC16位校驗碼生成程序,不用實現校驗,只要給定一個待傳輸數,能生成最終CRC碼就好。

uchar code CRCTable[256]={
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};

/*輸入:待校驗的數據首地址+長度 輸出:校驗和*/
uchar CRC_VAL(uchar *buf,uchar len)
{
uchar i,crcdat = 0;
for(i = 0; i<len; i++)
crcdat = CRCTable[*(buf+i)^crcdat];
return crcdat;
}

Ⅵ crc 計算機網路

2017年12月29日,星期五,

兄弟,我先給你簡單再捋一遍CRC編碼的概念和計算公式,原理明白了,以後不管碰到什麼樣的題,你都會迎刃而解了。

首先,需要知道如下幾個概念,

  1. CRC編碼,就是你題目中所說的「待發字串」,它是經加工後帶有CRC校驗的待發送信息,

  2. CRC校驗碼,就是你題目中所說的「CRC循環冗餘碼」,以下都簡稱為CRC校驗碼,它是通過CRC規則計算得來,

  3. 多項式,即真實信息,就是未經CRC編碼規則處理的原始的信息,就是你題目中說的「已知信息碼」,原始的真實信息有兩種表現形式,以本題為例,

    a、原始信息的 二進制字串(形式):1000100101,

    b、原始信息的 多項式(形式):X^9+X^5+X^2+1,

    X^9+X^5+X^2+1多項式,就是由原始信息的二進制形式1000100101得來的,多項式中每一個因數都對應二進制形式 1000100101 中值為1的那一位,X^9 X^5 X^2就是2^9+2^5+2^2,那表示二進制數的權位,

    1000100101

    1*2^90*2^80*2^70*2^6 1*2^5 0*2^4 0*2^3 1*2^2 0*2^11*2^0

    2^0=1...2^9=1 000 000 000,凡是二進制字串中值為1的權位都出現在了多項式中,例如,二進制字串最高位(左1)的1,就是2^9,所以它出現在了多項式中,形狀為X^9,而二進制數串中值為0的權位都沒有出現在多項式中,可以數一下,二進制數串中有4個1,所以對應的多項式中有4個因子:X^9、X^5、X^2、1,其中多項式的最後一個因子1,其實就是X^0,而我們都知道,任何數的0次冪都是1(0除外),可以看出,這兩種形式是等價的,即1000100101=X^9+X^5+X^2+1,當我們再遇到多項式時,就是去數原始信息(1000100101)中的1,然後把它的值為1的權位放到一起,寫成式子(X^9+X^5+X^2+1),兩者意義是一樣的,從二進制形式能推導出多項式,也可以從多項式推導出二進制形式,

  4. 生成多項式,就是你題目中提到的「G(x)=X^5+X^4+X^2+1」,生成多項式也可以寫成二進制形式,X^5+X^4+X^2+1其對應的二進制形式:110101,

  5. 通常,我們為了方便說明問題將生成多項式叫做:G(x),這里請注意,需要將

「生成多項式」和「多項式」進行區分,G(x)中的G就是generator polynomial,生成多項式的意思,

多項式:指的是原始信息1000100101中所有權位為1的權位寫在一起的形式X^9+X^5+X^2+1

生成多項式:是人為指定的多項式,由編碼人指定的東西,本例被人為指定成X^5+X^4+X^2+1即 110101 ,這個生成多項式是人為指定的,不是固定的,個人理解你指定成X^5+X^3+X^2+1也行,制定成X^5+X^4+X^3+X^2+1也行,


好了,接下來,我們要說最關鍵的CRC的定義和計算過程了,

CRC的定義:

  • 多項式*2^(G(x)的最高次冪指數,你給的圖片題目中G(x)的最高次冪指數是5)/G(x)=CRC校驗碼;

    用文字表達,就是原始數據信息乘以,2的 【生成多項式中最高冪指數】 次冪,乘2的多少次冪,就是在右邊加幾個0,比如乘以2^2,就是在右邊加2個零,因為是二進制數,所以乘幾個2就是加幾個零,和十進制數乘幾個10就是加幾個零道理一樣,然後再去除以生成多項式,請注意,這里的除,不是數學中的除法,而是指計算機中的模二除運算,實際上就是邏輯異或運算,說白了,就是將除數和被除數高位,進行左對齊後,相同為0,不同為1,然後一直除下去,直到得到最後的余數為止,這個余數就是我們需要的CRC校驗碼,而且這個最後得到的余數,取幾位由生成多項式中最高冪指數決定,最高冪指數是5就取5位,最高冪指數是6就取6位,最高冪指數是4就取4位,是根據生成多項式的最高次冪來定取幾位的.本例中,最高次冪是5,所以,最後的余數是5位二進制數,

    X^5+X^4+X^2+1寫成二進制就是: 110101

  • 你的圖片題目中,G(x)=X^5+X^4+X^2+1,也就是生成多項式是110101,

結合本題,我們來做一遍,原始數據:1000100101,生成多項式:110101,根據上面的規則有,

1000100101*2^5=1000100101 00000



把原始值右邊加上5個零:1000100101 00000之後,去除以生成多項式:110101

1000100101 00000

110101

----------------------------

0101110101 00000

左對齊,並開始按位異或,得0101110101 00000,



進行第二次除運算:

101110101 00000

110101

--------------------------

011011101 00000

左對齊,再按位異或,得到011011101 00000




開始第三次除運算:

11011101 00000

110101

--------------------

00001001 00000

左對齊,再按位異或,得到00001001 00000



進行第四次除運算:

100100000

110101

-----------------

010001000

左對齊,再異或,得到010001000



進行第五次除運算:

10001000

110101

------------

01011100

左對齊,再異或,得到01011100



進行第六次除運算:

1011100

110101

-------------

0110110

左對齊,再異或,得到0110110



進行第七次,最後一次除運算:

110110

110101

------------

000011


最終余數為000011,而由G(x)的最高次冪X^5的冪指數決定了,CRC校驗碼取5位,因此,最終得到的CRC校驗碼為:00011,

  • 多項式*2^(G(x)的最高次冪指數,本例中G(x)的最高次冪指數是5)+G(x)=最終在物理線路上傳送的CRC編碼待發字串,

用文字表達就是,原始數據乘以,2的 【生成多項式中最高冪指數】 次冪,然後再加上生成多項式,最終得到要在線路中傳送的CRC編碼待發字串,

接著,以本例進行餘下的計算,原始數據:1000100101,CRC校驗碼(CRC循環冗餘碼)為:00011,

根據上面的定義,有:

1000100101*2^5=1000100101 00000,

1000100101 00000

+ 00011

----------------------

100010010100011

所以最終的「待發字串」CRC編碼為:100010010100011

Ⅶ 關於計算機網路的crc計算

我們知道,一台主機向另外一台主機發送報文的時候,需要一層層經過自己的協議棧進行數據封裝,到達最後一層(四層協議的網路介面層)時需要在幀尾部添加FCS校驗碼(通過CRC演算法得出)。當對端主機收到時,在接收端同樣通過CRC演算法進行驗證,確認傳輸過程中是否出現錯誤。它只能確認一個幀是否存在比特差錯,但沒有提供解決措施。


循環冗餘校驗的原理

  • 在發送端,先把數據劃分為組(即:一幀)。假定每組 k 個比特。

  • 在每組後面,添加供差錯檢測用的 n 位冗餘碼一起發送。即:實際發送長度為:k+n 比特。

  • 發送前雙方協商n+1位的除數P,方便接收方收到後校驗。

  • 給K比特的數據添加除數減一個0(P-1)作為被除數,與第三步確定的除數做「模2除法」。得出的余數即FCS校驗序列,它的位數也必須是(P-1)。

  • 將FCS校驗序列添加至K個比特位的後面發送出去。

  • 接收方對接收到的每一幀進行校驗,若得出的余數 R = 0,則判定這個幀沒有差錯,就接受(accept)。若余數 R ≠ 0,則判定這個幀有差錯,就丟棄。

  • 對「模2除法」進行說明:

    「模2除法」與「算術除法」類似,但它既不向上位借位,也不比較除數和被除數的相同位數值的大小,只要以相同位數進行相除即可。模2加法運算為:1+1=0,0+1=1,0+0=0,無進位,也無借位;模2減法運算為:1-1=0,0-1=1,1-0=1,0-0=0,也無進位,無借位。相當於二進制中的邏輯異或運算。

    計算示例


    那麼接收方拿到的就是:101001001。再以它為被除數,1101為除數進行「模2除法」。

Ⅷ 我要用C語言編寫CRC16效驗碼。通過輸入一個串然後計算出CRC16效驗碼。例如:輸入010600001388計算得到849C

int cal_crc(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned int crc_value =0;
while(len--)
{
for(i=0x80; i!=0; i>>=1 )
{
if (crc_value&0x8000)
crc_value = (crc_value << 1) ^0x8005 ;
else
crc_value = crc_value << 1 ;
if(*ptr&i)
另外,站長團上有產品團購,便宜有保證

Ⅸ 計算機網路原理的計算題(CRC校驗和數據傳輸問題)

第一題:進行模2除法時被除數錯了,應該是M*2^4,不是M*2^5,因為多項式是4階的,在M後面添4個0