为什么 CRC 多项式以正常、反转等形式给出?
Why are CRC Polynomials given as Normal, Reversed, etc.?
我正在学习 CRC,搜索引擎和 SO 对此一无所获....
为什么我们有 "Normal" 和 "Reversed" 以及 "Reciprocal" 多项式?喜欢大端、小端还是其他?
CRC 的经典定义将使用 non-reflected 多项式,它将 CRC 左移。如果用于计算的字长大于 CRC,那么您需要在最后执行一个操作来清除移入的高位(例如 & 0xffff
对于 16 位 CRC)。
你可以翻转整个东西,使用反射多项式,右移而不是左移。这提供了相同的 CRC 属性,但是消息中的位是从最低有效位到最高有效位,而不是最高有效位到最低有效位。由于您正在向右移动,无关的位从底部掉落到被遗忘的地方,并且不需要额外的操作。这可能是使用速度稍快和更紧凑的实现的早期动机之一。
有时原始硬件的规范是从最低位到最高位处理的,因此您必须使用反射版本。
不,none 这有利于小端或大端。在 little-endian 或 big-endian 架构中可以轻松计算任何一种 CRC。
我正在学习 CRC,搜索引擎和 SO 对此一无所获....
为什么我们有 "Normal" 和 "Reversed" 以及 "Reciprocal" 多项式?喜欢大端、小端还是其他?
CRC 的经典定义将使用 non-reflected 多项式,它将 CRC 左移。如果用于计算的字长大于 CRC,那么您需要在最后执行一个操作来清除移入的高位(例如 & 0xffff
对于 16 位 CRC)。
你可以翻转整个东西,使用反射多项式,右移而不是左移。这提供了相同的 CRC 属性,但是消息中的位是从最低有效位到最高有效位,而不是最高有效位到最低有效位。由于您正在向右移动,无关的位从底部掉落到被遗忘的地方,并且不需要额外的操作。这可能是使用速度稍快和更紧凑的实现的早期动机之一。
有时原始硬件的规范是从最低位到最高位处理的,因此您必须使用反射版本。
不,none 这有利于小端或大端。在 little-endian 或 big-endian 架构中可以轻松计算任何一种 CRC。