crc的c語言實現,c語言實現crc16

本文目錄一覽:

crc16校驗的c語言程序

下面我們以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數據流

{

unsigned short msb; //crc寄存器將移出的最高1bit

unsigned short data;

unsigned short gx = 0x8005, i = 0; //i為左移次數, gx為生成多項式

data = (unsigned short)data_crc;

data = data 8;

reg = reg ^ data;

do

{

msb = reg 0x8000;

reg = reg 1;

if(msb == 0x8000)

{

reg = reg ^ gx;

}

i++;

}

while(i 8);

return (reg);

}

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

用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; countstrlen(str);count++)

{

ret = ret1;

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 = num1;}

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語言零基礎,怎麼用C語言實現CRC16檢驗碼

1.系統先把所有的float轉換為double類型運算,最終得到的結果截取前七個作為有效數字,這樣做可以使計算結果更準確。

2.有效數字:從左邊第一個不是0的數字起,到精確到的位數止,所有的數字都叫做這個數的有效數字。比如:1.24的有效數字就是

1、2、4。0.24

的有效數字就是

2、4。

3.

同樣的二進制數,假定你定義有符號(signed)類型,則第一位表示的是正負號,0代表正數,1代表負數;而如果定義無符號型(unsigned)的話,第一位為值了。

4.如果用指數表示,float類型有效數字為6~7位。double類型為15~16位,具體跟數字有關。

5.這個你是在哪看的啊,不對!

整形常量分為十進制、八進制、十六進制:

八進制形式為012前面有個零,十六進制為0x12前面有個0x(注意x前面是零),

而在一個八進制數字前面加\表示是字符型常量,例如\012為ASCII碼為10的字符!

這是我逐字敲上去的,還希望您能採納!

大俠給我個完整的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語言實現CRC校驗

把我知道的說一下:

碼流後面加8個0可以用移位得到(碼流8;)

單次異或運算可以用運算符:^(運算符兩邊為常數)

由於你校驗的是5個字節,且要多次異或運算,所以得藉助數組,或其它的數據結果才能完成。

最後問一下你是做硬件的嗎

CRC的C語言的程序

按位計算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] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};

unsigned char len = 16;

void main( void )

{

unsigned long temp = 0;

unsigned int crc;

unsigned char i;

unsigned char *ptr = test;

while( len– ) {

for(i = 0x80; i != 0; i = i 1) {

temp = temp * 2;

if((temp 0x10000) != 0)

temp = temp ^ 0x11021;

if((*ptr i) != 0)

temp = temp ^ (0x10000 ^ 0x11021);

}

ptr++;

}

crc = temp;

printf(“0x%x “,crc);

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/192851.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 10:30
下一篇 2024-12-01 10:30

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論