Java Reed Solomon的第一个ECC是否始终与xor相同?

Java Reed Solomon的第一个ECC是否始终与xor相同?,java,zxing,reed-solomon,Java,Zxing,Reed Solomon,我现在和里德·所罗门一起工作。据我所知,第一个纠错码总是与数据字的异或相同,因为vandermonde矩阵的第一行总是1,galois域中元素的加法等于异或 现在,我尝试使用ReedSolomonEncoder的Zxing 3.3.0实现获取一些代码字。请参阅Java中的以下列表: ReedSolomonEncoder rs=新的ReedSolomonEncoder(GenericGF.QR\u代码\u字段\u 256); int[]码字={72,87,0,0}; rs.encode(码字,2)

我现在和里德·所罗门一起工作。据我所知,第一个纠错码总是与数据字的异或相同,因为vandermonde矩阵的第一行总是1,galois域中元素的加法等于异或

现在,我尝试使用ReedSolomonEncoder的Zxing 3.3.0实现获取一些代码字。请参阅Java中的以下列表:

ReedSolomonEncoder rs=新的ReedSolomonEncoder(GenericGF.QR\u代码\u字段\u 256);
int[]码字={72,87,0,0};
rs.encode(码字,2);
System.out.println(“Ecc用于“+码字[0]+”和“+码字[1]);
System.out.println(“XOR:+(72^87));
System.out.println(“RS#1:+码字[2]);//这不是也应该是31吗?
System.out.println(“RS#2:+码字[3]);
这将提供以下输出:

有两种可能性:

  • 我对里德·所罗门有一种误解
  • 我以错误的方式使用了实现(因为javadoc编写得很糟糕)

  • 或者这是一个bug,我不相信。

    这是第一个综合症,它是编码消息的异或,并且只有当生成器多项式的形式是(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)

    在这种情况下,解码时,综合征[0]是消息中所有字节的异或。综合征也可以可视化为长除法(无填充用于综合征计算):

    通过将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
    

    我想知道28+3=31是否是巧合?@AdrianPetrescu我检查过这个。看来,XOR=RS#1(XOR)RS#2总是适用的。好吧,酷!然后我要检查的下一件事是,如果RS#1总是包含和的高阶字节的一半,而RS#2总是包含和的低阶字节的一半,就像在本例中一样。如果是这样的话,我想这就是你的答案——你是对的,只是ZXing在输出数组中分别存储每个字节。但是我想有两个更正字。第一个应该是31,第二个应该是2*87+72(使用GF(256))=164+72=236的运算符(如果我做得对的话)@Obererpel-我更新了我的答案,加入了通过长除法生成综合征的例子。链接到解释Sj的wiki文章,除了这种情况,
    j
    从0到n-k-1,因此这两个综合征是S0和S1,其中S0是解码消息中元素的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
    
              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