win7の:私は、OSを使用しています。
VS2010 SP1 +:私は、開発環境を使用します
アルゴリズムのソースコード:
INT create_crc_2符号なし(unsigned int型parr_lenはunsigned char *パー) { unsigned char型* PBUF = NULL; //データ長奇数である、データ0の前に IF(parr_len%1 == 2) { parr_len + = 1; PBUF =新しい新しい(STD :: nothrow)はunsigned char [parr_len]; のmemset(PBUF、0、parr_len) のmemcpy(&PBUFの、パール、parr_len - 1 [1]); } //データ長が偶数、コピーされたデータであり、 他は、 { PBUF新しい新=(STD :: nothrow)はunsigned char [parr_len]; のmemcpy(PBUF、パール、parr_len); } // CRCは、32ビットのデータ構造をシフトするために使用され、32ビットのための生成多項式を策略 0 = CRC長い符号なし= 0、プロイ; // CRC剰余値 unsigned int型crc_code = 0。 0 = I = 0、K = 0、J int型 // CRC =を0xFFFF0000 // CRCチェックサムを初期値0 CRC = 0; プロイ= 0×80000000; // 32ビットの生成多項式計算 策略=策略^(( )unsigned long型PLOYNOMAL << 15); //(I = 0、I 2を<; I ++)は予め設定されたシフトレジスタを達成するために、符号化する前に、すべて1である //最初の16ビットのデータ項目がCRCに話すだろう = CRC ((unsigned long型)PBUF [0] << 24)^((unsigned long型)PBUFの[1] << 16); //シフトサイクルデータを達成するために、CRC剰余を計算する (I = 2の場合、iは< ( 。INT)+ 1 parr_len; + I = 2) { //データ項目はシフトが完了PBUFがあるか否かを判断する IF(I <(INT)parr_len) { //何シフトが完了していない場合、移動PBUF [ i]は、PBUF [I + 1 ] CRC = CRC ^((unsigned long型 )PBUF [I] << 8)^((unsigned long型)PBUF [I + 1 ]); } //シフトが完了し、その後に下位16ビットCRC 0000に 他 { / /それがデータ項目の全てが「1」の位置0になる前に「1」ビットは廃棄しなければならないれている最初のビットからのデータ項目をシフトを開始する必要があるので、 CRC = CRC&を0xFFFF0000; } (IF = 2 I =) { //ラウンド0 ながら((CRC&は0x80000000!)) { CRC = CRCは<< 1; // Kは、ゼロの数が切り捨てられる 。K = K + 1 IF(CRC == 0) BREAKを; } // K 0の切り捨て、16-Kのためのこれだけシフト時間なぜなら 以下のために(; J <(16 - K); J = 0 J ++) { //は、または削除するかどうかを判定する1 (は0x80000000&CRC)IF CRC =((^プロイCRC)<< 1); 他の CRC = CRC 1 <<; } } } } 他 { ため(J = 0; J <16; J ++) { //は削除か否かを判定する1 (は0x80000000&CRC)IF ((^プロイCRC)<< 1)CRC =; 他 CRC = CRC 1 <<; } crc_code =(unsigned int型)(CRC >> 16); //クリアバッファ (= NULL PBUF!)IF { [] PBUF削除; ; PBUF = NULL } 結果を返す// crc_codeを返します; }