CRC 校验 XOR Function return value is always is 0
CRC check XOR Function return value is always 0
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试从执行 CRC 操作的 XOR 函数打印出 return 值时,它总是打印 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 位。
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试从执行 CRC 操作的 XOR 函数打印出 return 值时,它总是打印 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 位。