2017-04-11 9 views
0

32ビットの符号なし整数を使用してCRC16を計算するコードを作成しています。 CRC演算を実行するXOR関数から戻り値を出力しようとすると、常に0が出力されます。print文などのさまざまなデバッグ方法を試しましたが、わかりません!CRCチェックXOR関数の戻り値は常に0です

は、ここに私のXOR関数です:

uint32_t XOR(uint32_t divisor, uint32_t dividend) 

{ 
    uint32_t divRemainder = dividend; 
    uint32_t currentBit; 

    for(currentBit = 32; currentBit > 0; --currentBit) 
    { 
    if(dividend && 0x32) 
    { 
     divRemainder = divRemainder^divisor; 
    } 
    divRemainder = divRemainder << 1; 
    } 
    return (divRemainder >> 8); 
} 

上記のメソッドを呼び出す関数:

void crcCalculation(char *text, FILE *input, char *POLYNOMIAL) 
    { 
     int i = strlen(text); 
     uint32_t dividend = atoi(POLYNOMIAL); 
     uint32_t result; 


     readInput(text, input); 
     printText(text); 


     printf("CRC 16 calculation progress:\n"); 


     if(i < 504) 
     { 
     for(; i!=504; i++) 
     { 
      text[i] = '.'; 
     } 
     } 

    result = XOR((uintptr_t)POLYNOMIAL, dividend); 

     printf(" - %d", result); 

} 

は、一定の多項式(私はCRC 16のためにこれを正しく計算願っています:

#define POLYNOMIAL A053 

正しい方向に微調整していただければ幸いです。

+3

論理ANDとビットANDの違いをご存知ですか? – user694733

+0

@ user694733私はそうではない、私は彼らが同じものだと思った。私はそれを読むでしょう。 – starlight

+2

'POLYNOMIAL'が指しているデータではなくポインタ自体のチェックサムを作成しません。それはあまり役に立たないようです。 'text'文字列のチェックサムも計算しません(ゼロ終了していない可能性があります)。あなたは本当にマクロを定義していますか?表示するコードと組み合わせても、それほど意味がありません。 –

答えて

3

コードif(dividend && 0x32)はまったく意味がなく、1と評価されます。これが何も働かない理由です。

おそらくif(dividend & 32)などを意味しますか?論理ANDの代わりにビット単位の論理積と同様です。そして、0x32十進数の代わりに0x20十進数32(これは意味があるかもしれません...おそらく?)16進数50

全体的にこのCRCアルゴリズムは非常に怪しいようです。たとえば、31ビットを反復するだけです。

+0

@ Lundinあなたの提案に従ったコードを更新しましたが、それでも0を出力します。間違って更新しましたか? – starlight

+0

@starlight私は実際に実装を理解していません、私は32ビットの整数がしなければならないものに従わない、あなたは16ビットの多項式を使用していないのですか?また、一般的には、回答が投稿されたときに全く別のものを尋ねるように質問を編集しないでください。さらに具体的な質問をする必要がある場合は、新しい質問を投稿してください。 – Lundin

関連する問題