crc16校驗的c語言程式,CRC的C語言的程式

2021-12-23 01:38:35 字數 2693 閱讀 3420

1樓:奧特曼在洗澡

下面我們以crc-16為例來說明任意長度資料流的crc校驗碼生成過程。我們採用將資料流分成若干個8bit字元,並由低位元組到高位元組傳送的並行方法來求crc校驗碼。具體計算過程為:

用一個16bit的暫存器來存放crc校驗值,且設定其初值為0x0000;將資料流的第一個8bit與16bit的crc暫存器的高位元組相異或,並將結果存入crc暫存器高位元組;crc暫存器左移一位,最低1bit補零,同時檢查移出的最高1bit,若移出的最高1bit為0,則繼續按上述過程左移,若最高1bit為1,則將crc暫存器中的值與生成多項式碼相異或,結果存入crc暫存器值;繼續左移並重覆上述處理方法,直到將8bit資料處理完為止,則此時crc暫存器中的值就是第一個8bit資料對應的crc校驗碼;然後將此時crc暫存器的值作為初值,用同樣的處理方法重複上述步驟來處理下一個8bit資料流,直到將所有的8bit字元都處理完後,此刻crc暫存器中的值即為整個資料流對應的crc校驗碼。

下面示出了其計算過程的流程圖:

在用c語言編寫crc校驗碼的實現程式時我們應該注意,生成多項式 對應的十六進位制數為0x18005,由於crc暫存器左移過程中,移出的最高位為1時與 相異或,所以與16bit的crc暫存器對應的生成多項式的十六進位制數可用0x8005表示。下面給出並行處理8bit資料流的c源程式:

unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)

//reg為crc暫存器, data_crc為將要處理的8bit資料流

i++;

} while(i < 8);

return (reg);

} 以上為處理每一個8bit資料流的子程式,在計算整個資料流的crc校驗碼時,我們只需將crc_reg的初值置為0x0000,求第一個8bit的crc值,之後,即可將上次求得的crc值和本次將要處理的8bit資料作為函式實參傳遞給上述子程式的形參進行處理即可,最終返回的reg值便是我們所想得到的整個資料流的crc校驗值。

2樓:

unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)

//reg為crc暫存器, data_crc為將要處理的8bit資料流

i++;

} while(i < 8);

return (reg);}

3樓:匿名使用者

crc生成

例: 功能取2個自變數: unsigned char *puchmsg ; 為生成crc值,把指標指向含有二進位制

的資料的緩衝器 unsigned short usdatalen ; 緩衝器中的位元組數。 該功能返回crc作為一種型別「unsigned short」。

crc產生的功能 unsigned short crc16(puchmsg, usdatalen)

unsigned char *puchmsg ; /*按資訊的位元組數計算crc */

unsigned short usdatalen ; /* quantity of bytes in message */

return (uchcrchi << 8 | uchcrclo) ;

}高位位元組表

/* table of crc values for high–order byte */

static unsigned char auchcrchi = ;

低位位元組表

/* table of crc values for low–order byte */

static char auchcrclo = ;

crc的c語言的程式

4樓:匿名使用者

按位計算crc採用crc-ccitt多項式,多項式為0x11021,c語言程式設計時,參與計算為0x1021。當按位計算crc時,例如計算二進位制序列為1001 1010 1010 1111時,將二進位制序列數左移16位,即為1001 1010 1010 1111 (0000 0000 0000 0000),實際上該二進位制序列可拆分為1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……

現在開始分析運算:

<1>對第一個二進位制分序列求餘數,豎式除法即為0x10000 ^ 0x11021運算,後面的0位保留;

<2>接著對第二個二進位制分序列求餘數,將第一步運算的餘數*2後再和第二個二進位制分序列一起對0x11021求餘,這一步理解應該沒什麼問題。如果該分序列為0,無需計算。

<3>對其餘的二進位制序列求餘與上面兩步相同。

<4>計算到最後一位時即為整個二進位制序列的餘數,即為crc校驗碼。

該計算方法相當於對每一位計算,運算過程很容易理解,所佔記憶體少,缺點是一位一位計算比較耗時。

下面給出c語言實現方法:

**如下:

unsigned char test[16] = ;

unsigned char len = 16;

void main( void )

ptr++;

}crc = temp;

printf("0x%x ",crc);}

c語言小程式的問題,c語言程式問題

注意標記符號所作用的程式域!其他的都是一些小問題,自己慢慢除錯這執行,相信你能執行成功的。c語言程式問題 c語言中只有傳遞值的一種方式,即使傳遞的是指標,還是指標的值,因此雖然p加了3,但是與pt無關,如果要修改指標形參,則要使用二重指標 include point char pt main pt ...

c語言的這段程式C語言中這段程式是什麼意思?

printf函式需要包含的標頭檔案 include 程式的主函式入口 void main printf n for i 0 i 4 i 每當第一層迴圈執行完一次後就執行一次printf n 換行 printf n 最後的執行結果 關鍵點是迴圈巢狀 i 0時 j從0開始 每次執行迴圈體後j 1 迴圈1...

C語言程式問題,我的c語言程式有什麼問題?

fun x,y,1 求每一行的最小值放進y裡面 fun x,y,0 求每一行的最大值放進y裡面 這個應該是判斷條件有問題,那個判斷形式應該是?前後返回的是判斷條件為真的時候的值,後面返回的是判斷條件不成立的時候的值,你這個寫法根本沒有改變flag的值,因為根本就沒有做賦值的操作。我的c語言程式有什麼...