CRC的3種方法

2021-08-07 02:14:01 字數 4268 閱讀 5250

一. crc16演算法

首先在原始檔標頭檔案加入錶值:

[cpp]view plain

copy

print?

//   

// crc16碼表   

static

word

const wcrc16table[256] = ;    

// // crc16碼表 static word const wcrc16table[256] = ;

然後在檔案中加入下列函式:

[cpp]view plain

copy

print?

//   

// 函式功能: crc16效驗   

// 輸入引數: pdatain: 資料位址   

//           ilenin: 資料長度              

// 輸出引數: pcrcout: 2位元組校驗值    

void ccrcdlg::crc16(const

char* pdatain, int ilenin, word* pcrcout)     

*pcrcout = wresult;     

}    

// // 函式功能: crc16效驗 // 輸入引數: pdatain: 資料位址 // ilenin: 資料長度 // 輸出引數: pcrcout: 2位元組校驗值 void ccrcdlg::crc16(const char* pdatain, int ilenin, word* pcrcout) *pcrcout = wresult; }

二.crc16(modbus)

[cpp]view plain

copy

print?

//   

// crc modbus 效驗   

// 輸入引數: pdatain: 資料位址   

//           ilenin: 資料長度              

// 輸出引數: pcrcout: 2位元組校驗值    

void ccrcdlg::checkcrcmodbus(const

char* pdatain, int ilenin, word* pcrcout)     

whi = wcrc / 256;     

wlo = wcrc % 256;        

wcrc = (whi << 8) | wlo;     

*pcrcout = wcrc;     

}     

word ccrcdlg::calccrcmodbus(char cdatain, word wcrcin)     

wcrcin = wcrcin & 0xffff;     

}     

return wcrcin;     

}    

// // crc modbus 效驗 // 輸入引數: pdatain: 資料位址 // ilenin: 資料長度 // 輸出引數: pcrcout: 2位元組校驗值 void ccrcdlg::checkcrcmodbus(const char* pdatain, int ilenin, word* pcrcout) whi = wcrc / 256; wlo = wcrc % 256; wcrc = (whi << 8) | wlo; *pcrcout = wcrc; } word ccrcdlg::calccrcmodbus(char cdatain, word wcrcin) wcrcin = wcrcin & 0xffff; } return wcrcin; }

三.crc16(ccitt的0xffff)

[cpp]view plain

copy

print?

//   

// 函式功能: crc16效驗(ccitt的0xffff效驗)   

// 輸入引數: pdatain: 資料位址   

//           ilenin: 資料長度              

// 輸出引數: pcrcout: 2位元組校驗值     

void ccrcdlg::crcccitt(const

char* pdatain, int ilenin, word* pcrcout)     

}      

}      

*pcrcout = wcrc;     

}    

// // 函式功能: crc16效驗(ccitt的0xffff效驗) // 輸入引數: pdatain: 資料位址 // ilenin: 資料長度 // 輸出引數: pcrcout: 2位元組校驗值 void ccrcdlg::crcccitt(const char* pdatain, int ilenin, word* pcrcout) } } *pcrcout = wcrc; }

//crc16校驗在通訊中應用廣泛,這裡不對其理論進行討論,只對常見的3種

//實現方法進行測試。方法1選用了一種常見的查表方法,類似的還有512字

//節、256字等查詢表的,至於查詢表的生成,這裡也略過。

// —————- popular polynomials —————-

//  ccitt:      x^16 + x^12 + x^5 + x^0                 (0x1021)

//  crc-16:     x^16 + x^15 + x^2 + x^0                 (0x8005)

#define         crc_16_polynomials      0x8005

// ————————————————————–

//      crc16計算方法1:使用2個256長度的校驗表

// ————————————————————–

const byte chcrchtalbe =                                 // crc 高位位元組值表

;const byte chcrcltalbe =                                 // crc 低位位元組值表

;word crc16_1(byte* pchmsg, word wdatalen)

return ((chcrchi << 8) | chcrclo) ;

}// ————————————————————–

//      crc16計算方法2:使用簡單的校驗表

// ————————————————————–

const word wcrctalbeabs =

;word crc16_2(byte* pchmsg, word wdatalen)

return wcrc;

}// —————————————————————–

//      crc16計算方法3:使用直接結算的方法

// —————————————————————–

word crc16_3(byte* pchmsg, word wdatalen)

}wcrc = wordinvert(wcrc);

return wcrc;

}//試驗資料:

//      採用metrowerks codewarrior在dsp56f80x平台上,對這3種方法

//進行了效能測試。

// —————————————————————-

//                      **大小(字)    額外儲存空間(字)        執行時間(週期數)

// —————————————————————-

//      方法1           32                      512                             540

//      方法2           57                      16                              1120

//      方法3           142*                    0                               4598

////說明:方法3的**大小還包括字反轉、位元組反轉程式(這裡沒有給出原始碼)

////結論:通常在儲存空間沒有限制的情況下,採用方法1是最好的,畢竟在

//通訊中,保障通訊速度是至關重要的。而方法2也不失為一種很好的方法,

//占用空間很少。而與方法2相比,方法3似乎不占有什麼優勢。

引導linux的3種方法

引導linux方法,我所知的有如下3種 方法1 引導軟盤 1 在linux下用mkbootdisk製作。2 如果硬碟引導資訊丟失,無法進入linux系統做引導軟盤,對於rh,用redhat linux光碟引導進入secure模式,當詢問是否將硬碟中的linux系統設定為當前環境,選 是 這時的系統進...

Fibonacci 實現的3種方法

斐波那契數列,又稱 分割數列,指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 定義如下 第一種方法 在當初第一次接觸遞迴的時候,例子就是fibonacci數的計算。實現 如下 long long fibonacci1 int n 第二種方法 通過使用兩個額外的空間換取時間的方法來改善第一...

定義函式的3種方法

1.三種方法 1 函式宣告function funcname 2 函式表示式var funcname function 注意 在使用函式表示式宣告函式的時候,function後面可以跟函式名,但是這個函式名,只限在函式內部使用,外部無法訪問。3 var funcname new function 語...