我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试打印执行 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
我会很感激在正确的方向轻推!
最佳答案
代码 if(dividend && 0x32)
完全没有意义,将评估为 1
。这就是为什么什么都不起作用的原因。
也许您的意思是 if(dividend & 32)
或类似的?就像按位 AND 而不是逻辑 AND 一样。和十六进制 0x20
十进制 32
(这可能有意义......可能不是?)而不是十六进制 0x32
十进制 50
(这根本没有任何意义)。
总的来说,这个 CRC 算法看起来很可疑。例如,您只能迭代 31 位。
关于CRC 校验 XOR 函数返回值始终为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43338548/