Reed-Solomon的第一个ECC总是与xor相同吗?

时间:2017-05-22 16:16:11

标签: java zxing reed-solomon

我现在和里德 - 所罗门一起工作。到目前为止,据我所知,第一个纠错码始终与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

有两种可能性:

  1. 我对里德 - 所罗门有误解
  2. 我正在以错误的方式使用该实现(因为javadoc写得不好)
  3. 或者这是一个错误,我在某种程度上不相信。

1 个答案:

答案 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