CRC 校验 XOR 函数返回值始终为 0

标签 c return xor crc

我正在编写代码来使用 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/

相关文章:

ruby - 对 ruby​​ 中的 2 个字符串执行按位异或

c - 为什么这个程序在用户信号处理程序之后没有终止

c - 下面的代码片段产生相同的输出。但哪个是正确的呢?

c - * 在 linux 命令行上

java - 如何返回两位小数字符串类型

c++ - 按名称返回 PID

java - 返回 null 和抛出异常有什么区别?

计算用 XOR 方法编写的谢尔宾斯基三角形的维数

c - 什么是异或和?

java - 将一串 1's and 0' 写入二进制文件?