當前位置:首頁 » 編程語言 » crc程序c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

crc程序c語言

發布時間: 2023-01-06 15:14:58

A. 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);
}

B. 用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. C語言實現CRC校驗

把我知道的說一下:
碼流後面加8個0可以用移位得到(碼流<<8;)
單次異或運算可以用運算符:^(運算符兩邊為常數)
由於你校驗的是5個位元組,且要多次異或運算,所以得藉助數組,或其它的數據結果才能完成。

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

D. 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校驗值。

E. 大俠給我個完整的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表示位元組串的包含的位元組個數。

F. C語言中CRC循環校驗的一個程序

while(len--!=0)
這句的len的值循環一次就減少1,先執行len!=0,再執行len--。
當len為0時退出循環。
for(i=0x80;
i!=0;
i/=2)
0x80是十六進制數,也即128
當i!=0時,執行循環體,
然後i=i/2,即i值減半。