本文目錄一覽:
- 1、crc16校驗的c語言程序
- 2、用C語言實現CRC編碼程序
- 3、C語言零基礎,怎麼用C語言實現CRC16檢驗碼
- 4、大俠給我個完整的crc 程序 用C語言實現的,能在PC機上運行的。我馬上拿出100分。。。
- 5、C語言實現CRC校驗
- 6、CRC的C語言的程序
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-tw/n/192851.html