在前一篇文章中,我们探索了在Excel中通过一组工作表函数计算出了伽罗华域 GF(2 8 ) 的全部元素:
RS码通常可以表示为 RS(n,k) 的形式, n 和 k 都是正整数且 n>k 。其中 n 表示数据码加上纠错码的长度,而 k 表示数据码的长度, n−k 为纠错码的长度。一般来说,所谓的数据码就是一串由正整数组成的一维数组,数组中的每一个元素的取值都必须在伽罗华域的元素集合内。由于一个字节取值正好在0~255之间,正好可以与 GF(2 8 ) 的元素一一对应,这就是为什么在计算机领域 GF(2 8 ) 的应用最为广泛的缘故之一。因此,在计算QR的RS纠错码时,所有的数据一定都是通过某种规则首先编成一组0~255之间的整数数组的,而且这个数组中元素的数量一定等于 k ,这样通过计算后能得到另外一个数组,其元素同样是0~255之间的整数,且数量为 n−k ,这个数组就是纠错码。将两个数组连接在一起,数据码在前,纠错码在后,连接成一个长度为 n 的数组,就形成了完整的RS纠错编码。
为了完成上述计算,通常将所有的数组都写成多项式的形式,其中每一项的系数就是编码各位置上的元素,比如,要计算以下数据码的 RS(9,3) 码:
其中, n=9,k=3 ,因此数据码有三个码字:
数据码:
接下来,只要将数据码多项式对生成多项式求余,就可以得到EC多项式了:
上面两个问题都可以通过工作表函数来实现,当然,VBA也没问题,下面先探讨工作表函数的方法。
首先需要解决伽罗华域上的加法和乘法的问题,伽罗华域上的加法其实是Xor运算,Excel的工作表并没有给出异或运算的函数,因此我的解决办法是自己写一个工作表函数CALCXOR(n1,n2)用于计算异或:
Private Function calcXor(n1 as long, n2 as long)as long
calcXor = n1 Xor n2
End Function
而乘法运算的定义是两个元素的本原元幂次相加,因此计算乘法需要两步,首先找出两个本原元的幂次,相加后再找到新的元素值,如:在 GF(2 8 ) 上计算123*126的结果,需要将123*126表示为
接下来,就需要完成多项式的求余,如果我们将多项式的系数写在表格中,那么前面的例子可以列表如下:
N | x 8 | x 7 | x 6 | x 5 | x 4 | x 3 | x 2 | x 1 | x 0 |
---|---|---|---|---|---|---|---|---|---|
除数 g(x) | 1 | 126 | 4 | 158 | 58 | 49 | 117 | ||
被除数(数据码) | 123 | 76 | 91 | 0 | 0 | 0 | 0 | 0 | 0 |
商1: 123∗g(x) | 123 | 32 | 82 | 97 | 94 | 230 | 3 | ||
余数1(数据Xor商1) | 0 | 108 | 9 | 97 | 94 | 230 | 3 | ||
商2: 108∗g(x) | 0 | 108 | 187 | 72 | 168 | 82 | 11 | 136 | |
余数2(余数1Xor商2) | 0 | 0 | 178 | 41 | 246 | 180 | 8 | 136 | |
商3: 178∗g(x) | 0 | 0 | 178 | 238 | 220 | 26 | 189 | 14 | 95 |
余数3(余数2Xor商3) | 0 | 0 | 0 | 199 | 42 | 174 | 181 | 134 | 95 |
于是,根据上表最终计算出余数,就是数据码的纠错码多项式,因此完整的纠错码多项式为:
在这篇文章里,我们讨论了使用工作表函数计算RS纠错码,下一篇文章里,我们再来看如何计算生成多项式 g(x) ,并且讨论使用VBA计算RS纠错码