crc - CRC 方法无法检测到哪些错误?
问题描述
让我们假设一个 16 位 CRC 多项式 x¹⁶+x¹²+x⁵+1 = 0x11021。该多项式可以:
- 检测所有单位错误(与数据大小无关)。
- 检测所有高达 16 位宽度的突发错误(与数据大小无关)。
- 检测所有奇数位错误(因为它有 4 个多项式项;与数据大小无关)。
- 检测高达 32571 位数据大小的 3 位错误 (HD4)。
考虑到以上几点是对的......CRC无法检测到什么样的错误。?
解决方案
这应该是检测所有最多 16 位的单个突发错误。
0x11021 是 2 个“素数”多项式 0xf01f 和 0x3 的乘积。0x3 因素是检测所有奇数位错误的原因(它是奇偶校验因素)。
由于检测到所有奇数位错误,因此该语句变为检测所有 2 位错误,最大数据大小为 32751 位或消息大小为 32767 位,其中包括附加到数据位的 16 位 CRC。对于蛮力方法,使用除第一位是一位之外的所有零位的位串,然后计算该串上的 CRC,直到 CRC 只有一个位作为最高有效位。这可以通过从 0x8000 的 CRC 开始并循环它直到它再次循环回到 0x8000 来模拟,这将需要 32767 个循环。因此,如果 bit[0] 和 bit[32768] == 1(所有其他位 == 0),则计算出的 CRC 将为零,即无法检测到 2 个错误位。
CRC 无法检测到哪些错误?
多个突发错误,其中突发的总距离跨越超过 16 位,本质上是一个长度超过 16 位的单个突发错误。
4 个或更多随机分布的误码的某些模式将无法被检测到。如下表所示,未检测到错误的可能性相当低。随着误码数量的增加,故障率会增加,但除非您有很多误码,否则它仍然很低。随机位模式将通过 CRC16 检查大约 1/65536 的时间,但这在正常的消息发送/接收序列中是不寻常的。
48 bit data, 16 bit crc, => 64 bit message
2^64 - 1 possible error patterns
84 of 635376 possible patterns of 4 error bits fail
2430 of 74974368 possible patterns of 6 error bits fail
133001 of 4426165368 possible patterns of 8 error bits fail
4621021 of 151473214816 possible patterns of 10 error bits fail
100246083 of 3284214703056 possible patterns of 12 error bits fail
推荐阅读
- vue.js - 为什么使用 beforeRouteEnter 而不是mounted?
- python-3.x - 从 odoo 管理网络服务
- mysql - 在 SQL 中创建列行
- javascript - 理解“this”在两种不同情况下的使用
- javascript - 带有 onclick 动画的多个按钮 - 某些按钮未完成 setTimeout
- powerbi - PowerBI - 使用映射到单独表中 ID 的固定和可变计算的组合聚合多行
- python - 浮点除法与整数除法给出不同的答案
- javascript - 斐波那契数列 - 从 JavaScript 中的特定 # 开始
- javascript - 如何使用 NodeJS 删除 dynamoDb 中的嵌套项
- c - 在函数递归内传递双指针