2017-04-11 396 views
0

我正在编写一个代码来使用32位无符号整数计算CRC16。当试图从执行CRC操作的XOR函数中输出返回值时,它始终打印0.我尝试了各种调试方法,例如打印语句,但是,我似乎无法弄清楚!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而不是逻辑AND。和十六进制0x20十进制32(这可能是有意义的...可能不是?),而不是十六进制0x32十进制50(这根本没有任何意义)。

总的来说这个CRC算法看起来很腥。例如,您只能迭代31位。

+0

@Lundin我按照你的建议更新了代码,但是它仍然输出0.我更新了错误吗? – starlight

+0

@starlight我没有真正理解实现,我没有关注32位整数应该做什么,是不是使用16位多项式?另外一般情况下,请不要编辑问题,以便在发布答案时提出完全不同的问题。如果您需要进一步询问具体问题,请发布一个新问题。 – Lundin