CRC校验和如何给出发生错误的位置?

时间:2014-07-20 03:44:40

标签: algorithm crc

我知道如何计算CRC校验和,我知道CRC校验和可以检测k-1位错误(k是校验和的长度)。但我很好奇的是校验和如何幸运地成为错误位的位置。

我知道汉明代码;汉明码的设计使得“校验和”成为可能。给出错误的位置。然而,我没有看到任何帖子解释为什么CRC校验和给出错误位位置。

我读过this; 它解释说"证明接收器可以纠正我们的错误 必须证明残差可以与任何其他不同的单个比特错误区分开来。"

这证明我们可以将残差映射到位错误的位置,但不能解释为什么它恰好是自然顺序。按自然顺序,我的意思是10表示位置2,11表示位置3。

Wikipedia似乎无法解释这一点,着名的A Painless Guide to CRC Error Detection Algorithms也没有解决这个问题。

有人可以解释或提供一些参考资料吗?

2 个答案:

答案 0 :(得分:1)

@jwodder感谢您让我的帖子更具可读性。 @Plo_Koon感谢您提供了大量相关信息,但我恐怕您没有回答我的问题:为什么CRC的剩余(或提醒)可以指示错误位的位置。 @laune感谢您分享参考资料。

我继续搜索并看到CRC chapter of hacker's delight并看到了一个参考,所以我找到了Tanenbaum,Andrew S.计算机网络第5版,SEC. 3.2 ERROR DETECTION AND CORRECTION并且它突然出现在我身上。

我在这里发表了我的理解,希望能帮助那些不了解CRC残差的原因可以指出单个位错误的位置。

让我们恢复正确的消息,我们应该收到的是T(x),我们实际收到的是T(x)+ E(x)。 E(x)中的每1位对应一位 已被倒置。然后我们用G(x)(生成器)来划分它,也就是说,我们计算

[T(x) + E(x)]/G(x)

T(x)/G(x)为0,因此我们获得的残差为E(x)/G(x)

如果G(x)包含两个或更多个术语(可能是&#34;一些允许恢复(在限制范围内)&#34;由@laune实现),它将永远不会分成E(x)。< / p>

这就是我们在进行CRC计算时准确得到残差位置的原因!

答案 1 :(得分:0)

检测或纠正错误的核心概念是 冗余。为了能够检测或纠正错误,我们需要 用我们的数据发送一些额外的位。这些冗余位 由发送者添加并由接收者删除。其 存在允许接收器检测或纠正损坏的 位。包含额外信息的概念 用于错误检测的传输是一个很好的传输。而不是 重复整个数据流,一组较短的比特 可以附加到每个单元的末尾。这种技术是 称为冗余,因为额外的位是冗余的 信息:一旦准确就被丢弃 传输已经确定。 图8显示了使用冗余位的过程 检查数据单元的准确性。一旦数据流有了 生成后,它会通过分析它的设备 并添加适当编码的冗余检查。该 数据单元,现在通过几次命中放大,通过链路传输到接收器。接收器将整个流通过 检查功能。如果收到的命中流通过了 检查标准,数据单元的数据部分是 接受并丢弃冗余位。

循环冗余校验(CRC)

最强大的冗余检查 技术是循环冗余校验(CRC)。 CRC基于多项式算法,特别是在计算时 在GF(2)中划分一个多项式的余数(具有两个元素的伽罗瓦域) 另一个。 与基于添加的奇偶校验不同。 CRC基于 二元分裂。在CRC中,而不是添加位来实现a 期望的奇偶校验,一系列冗余位,称为CRC 或CRC余数附加到数据单元的末尾 这样得到的数据单元就可以完全被a整除 第二,预定的二进制数。在它的目的地, 输入数据单元除以相同的数字。如果在这 步骤没有假定数据单元的余数 完整的,因此被接受。余数表示 因此,数据单元在运输过程中已经损坏 必须被拒绝。 CRC使用的冗余位通过除法得出 数据单元由预定的除数;剩下的就是 CRC。为了有效,CRC必须具备两个品质:必须 只有一个比除数少一点,然后追加它 到数据字符串的末尾必须生成结果位 序列完全被除数整除。 CRC错误的理论和应用 检测很简单。唯一的复杂性在于 得出CRC。

CRC的表现

CRC是一种非常有效的错误检测方法。如果是除数 根据前面提到的规则选择, 1.CRC可以检测到影响奇数的所有突发错误 比特。 2.CRC可以检测长度小于或等于的所有突发错误 达到多项式的程度 3.CRC可以非常高的概率检测突发错误 长度大于多项式的次数。

纠正错误

错误的纠正比检测更困难。 在错误检测中,我们只想查看是否有任何错误 已经发生了。答案是简单的是或否。我们不是 甚至对错误的数量感兴趣。单比特错误是 对我们来说同样是一个突发错误。在纠错中,我们 需要知道损坏的确切位数 更重要的是,他们在信息中的位置。该 错误的数量和消息的大小 重要因素。如果我们需要纠正一个错误 一个8位数据单元,我们需要考虑八个可能的错误 位置;如果我们需要纠正数据单元中的两个错误 相同的尺寸,我们需要考虑28种可能性。您可以 想象一下接收者在数据中发现10个错误的困难 单位为1000位。

计算所需的冗余位数r 纠正给定数量的数据位m。我们必须找到一个 mr之间的关系。使用m位数据和r位 冗余添加到他们,结果的长度 代码是m + r。如果是可传输的总位数 单位是m + r。那么r必须至少能够表明 m+r+1个不同的州。其中,一个州意味着没有错误, 和m + r个状态表示每个错误的位置 m + r职位。

因此,m+r+1位必须能够发现r个状态:r 位可以指示2^r个不同的状态。因此2^r必须是 等于或大于m+r+1

2^r=>m+r+1

例如,如果m的值为7(如7位ASCII中那样) 代码),可满足此等式的最小r值 4:

2^4=>7+4+1

汉明代码

汉明提供了一个实用的解决方案。汉明码 可以应用于任何长度的数据单元并使用 讨论了数据和冗余位之间的关系 以上。例如,7位ASCII代码需要4 可以在数据末尾添加的冗余位 单位或穿插原始数据位。在图17中, 这些位被放置在位置1,2,4和8( 在11位序列中的位置是2的幂。

有关信息和示例,请参阅此链接(以上所有信息均来自1个链接): 123