一. 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 語...