C ++ char配列CRC計算アルゴリズム

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を返します; 
}

  

 

おすすめ

転載: www.cnblogs.com/pandamohist/p/11089116.html