关于CRC基础知识的一些问题

时间:2016-06-17 16:39:45

标签: checksum modulo crc polynomials

我是一名电子工程师,并没有发现从纯粹的数学角度考虑CRC非常重要。但是,我有以下问题:

  1. 为什么在计算CRC时我们在消息中添加n个零,n是生成多项式的次数?我在模2长分区以及CRC

  2. 的硬件实现中已经看到了这一点
  3. 为什么我们希望生成多项式可以被(x + 1)整除?

  4. 为什么我们希望生成多项式不能被x整除?

1 个答案:

答案 0 :(得分:7)

  1. 我们在计算n位CRC时添加n个零,因为当将CRC附加到消息并发送整个(电信中的常规做法)时:
    • 这允许接收方处理CRC的比特,就像消息的其余部分一样,导致任何无差错传输的已知余数。当消息的结尾由跟随 CRC(通常的做法)指示时,这尤其有用;在接收端,它保存了n位缓冲区,在发送端,它几乎没有增加复杂性(x(n)的额外项在CRC传输期间减少到AND门强制消息位为零,以及在发送CRC时执行n额外减少步骤 在数学上,发送的CRC是(M(x) * x^n) mod P(x) = R(x)(可能在某个常数内,或者/并且可能在M(x)的开头添加一些规定的位,对应于CRC寄存器的初始化),并且计算出的CRC接收方是M(x)R(x)的串联,即为 (M(x) * x^n + R(x)) mod P(x),为零(或表示常数)。
    • 它确保影响消息结束和连续CRC的错误突发受益于多项式选择所提供的全部保护。特别是,如果我们将C(x)计算为M(x) mod P(x),则在错误检测中使用的大多数多项式确保时,翻转M(x)的最后一位和C(x)的最后一位将不会被检测到检测到任何两位错误,直到某个大的邮件大小。
  2. 通常的做法是将CRC多项式用于可被x+1整除的错误检测,因为它可以确保检测到影响奇数位的任何错误。然而,这种做法并不普遍,并且有时会阻止为更好的一些有用定义选择更好的多项式,包括最大化消息长度以便总是检测到m个错误(假设没有同步丢失) mn的组合。特别是,如果我们希望能够检测到可能的最长消息的任何2位错误(这将是2 n -1位,包括n位CRC ),我们需要多项式是原始的,因此是不可简的,因此(n> 1)不能被x+1整除。
  3. 通常的做法是将用于错误检测的CRC多项式不能被x整除,因为否则生成的CRC的最后一位将是常量,并且无助于检测其余信息中的错误+ CRC。
相关问题