我现在和里德 - 所罗门一起工作。到目前为止,据我所知,第一个纠错码始终与xor'ing数据字相同,因为vandermonde矩阵的第一行总是1,而galois域中元素的加法等于xor。 / p>
现在我尝试使用ReedSolomonEncoder的Zxing 3.3.0实现来获取一些代码字。请参阅Java中的以下列表:
ReedSolomonEncoder rs = new ReedSolomonEncoder(GenericGF.QR_CODE_FIELD_256);
int[] codeword = {72,87,0,0};
rs.encode(codeword, 2);
System.out.println("Ecc for " + codeword[0] + " and " + codeword[1]);
System.out.println("XOR: " + (72^87));
System.out.println("RS #1: " + codeword[2]); // Shouldn't this be 31 too?
System.out.println("RS #2: " + codeword[3]);
其中给出以下输出:
Ecc for 72 and 87
XOR: 31
RS #1: 28
RS #2: 3
有两种可能性:
或者这是一个错误,我在某种程度上不相信。
答案 0 :(得分:4)
它是第一个独有或编码消息的综合症,并且只有当生成多项式的形式为(x + 1)(x +α)(x +α^ 2)...时。在这种情况下,“第一个连续根”是1.对于其他实现,“第一个连续根”是α,生成多项式是(x +α)(x +α^ 2)(x +α^ 3) ......生成多项式选择还有其他变体,例如GF(256)中的(x + a ^ 127)(x + a ^ 128)对于自倒数多项式,1x ^ 2 + ?? x + 1。
在这种情况下,GF(256)基于9比特多项式x ^ 8 + x ^ 4 + x ^ 3 + x ^ 2 + 1或十六进制11d。 α是基元,在这种情况下α= x + 0 == hex 02。生成多项式为(1x + 1)(1x + 2)= 1x ^ 2 + 3x + 2.编码过程可以显示为长除法,如下面的十六进制所示。消息乘以x ^ 2(用两个零填充),为两个奇偶校验字节留出空间:
48 8f
------------
1 3 2 |48 57 00 00
48 d8 90
--------
8f 90 00
8f 8c 03
--------
1c 03 remainder
从填充的消息中减去余数,但加法和减法都是独占的或GF(256),因此编码的消息变为
48 57 1c 03
匹配您得到的结果(十六进制1c =十进制28)。
在解码时,在这种情况下,syndrome [0]是消息中所有字节的xor。这些综合症也可以看作长分裂(没有填充用于综合症计算):
syndrome 0: syndrome 1:
48 09 03 48 c7 8f
------------ ------------
1 1 |48 57 1c 03 1 2 |48 57 1c 03
48 48 48 90
----- -----
1f 1c c7 1c
1f 1f c7 93
----- -----
03 03 8f 03
03 03 8f 03
----- -----
00 00
通过将57更改为56来创建错误值01:
48 1e 02 48 c6 8d
------------ ------------
1 1 |48 56 1c 03 1 2 |48 56 1c 03
48 48 48 90
----- -----
1e 1c c6 1c
1e 1e c6 91
----- -----
02 03 8d 03
02 02 8d 07
----- -----
01 04