SEC/DED简介
由于一位奇偶校验只能检查出奇数个错误且无法定位错误和纠正错误.于是海明就想把多奇偶结合起来,弥补一位奇偶校验的部分缺点.
海明编码中的每一位有效信息位至少被两位校验位所校验,因此可以做到定位一位错误和纠正一位错误和检测两位错误.
缺点:无法区分一个错误和两个错误
套路
校验位数r及其位置
有效信息(k位) + 检验信息(r位): k+r ≤2^r - 1
傻子才反复算,一次算完查表,你要看247位以上的???想吧.
k | r-min |
---|---|
1 | 2 |
2~4 | 3 |
5~11 | 4 |
12~26 | 5 |
27~57 | 6 |
58~120 | 7 |
121~247 | 8 |
248~… | … |
从上表可知,要对一个字节(8bits)进行海明校验则需要另外半个字节的长度,两字节(16bits)则要5位校验码.
第i个海明码校验码Pi位于第2^(i-1)位.比如第一个校验码在第一位,而第三个校验码在第八位.
如下图(csdn表格真的难搞…)
位置j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | … |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
编码之后的数据位 | P1 | P2 | D1 | P4 | D2 | D3 | D4 | P8 | D5 | D6 | D7 | D8 | D9 | D10 | D11 | P16 | D12 | D13 | D14 | D15 | D16 | D17 | … | ||
拆分P | 1+2 | P4 | 1+4 | 2+4 | 1+2+4 | 1+8 | 2+8 | 1+2+8 | 4+8 | 1+4+8 | 2+4+8 | 1+2+4+8 | 1+16 | 2+16 | 1+2+16 | 4+16 | 1+4+16 | … | lazy |
根据设计思想:每一个数据都至少被两个校验码所校验,故第j位的数据被编号小于j的若干个海明位号之和等于j的校验位所校验。
举个例子,八位数据D1D2…D8,查表可知需要四个校验位(P1,P2,P4,P8)
D1被谁校验了呢?D1位于第3位,小于3的海明码又位号和为3的只有P1,P2;
D2也如此,第五位,5=1+4,说明D2被P1,P4校验了.
D3呢?第六位,6 =2 +4 ,说明第D3被P2,P4校验了.
D4,7=1+2+4,说明第D3被P1,P2,P4校验了.
…类推
计算校验位Pi
对于八位数据D1D2…D8,先把校验位空出来??D1?D2D3D4?D5D6D7D8
P1 = D1⊕D2⊕D4⊕D5⊕D7
P2 = D1⊕D3⊕D4⊕D6⊕D7
P4 = D2⊕D3⊕D4⊕D8
P8 = D5⊕D6⊕D7⊕D8
然后把P1,P2,P4,P8填进去即可
那如果是十六位呢??还是一样的套路啊,拆分的P中哪些数据位下有P几,异或运算就算那些对应的数据位
P1 = D1⊕D2⊕D4⊕D5⊕D7⊕D9⊕D11⊕D12⊕D14⊕D16
P2 = D1⊕D3⊕D4⊕D6⊕D7⊕D10⊕D11⊕D13⊕D14
P4 = D2⊕D3⊕D4⊕D8⊕D9⊕D10⊕D11⊕D15⊕D16
P8 = D5⊕D6⊕D7⊕D8⊕D9⊕D10⊕D11
P16=D12⊕D13⊕D14⊕D15⊕D16
总结
要是教材写的在让人更容易明白一点,我宁愿减寿一年.
入门白菜,欢迎指教拍砖.
相关链接
- COD (这方面的内容有点少)
- 计算机组成与系统架构 (有点小错误)
- https://blog.csdn.net/u010927640/article/details/49531781?locationNum=3&fps=1 (深入浅出)
- https://www.mscto.com/void/536131.html (+电路)
- https://blog.csdn.net/callinglove/article/details/84852374 (+代码)
- https://www.icourse163.org/learn/HUST-1003159001?tid=1450203445#/learn/content?type=detail&id=1214319387&cid=1217937711 (视频)