Java ECC中的例外

Java ECC中的例外,java,exception,indexoutofboundsexception,reed-solomon,Java,Exception,Indexoutofboundsexception,Reed Solomon,我正在尝试实现ECC:纠错码/reed-solomon。我尝试将其应用于一个文件,但每次都会分割。我的问题是,它适用于第一次拆分,但随后出现以下错误: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8217 at package_name.GF28.mult(GF28.java:73) at package_name.Encoder.encode(Encoder.java:36) at package_n

我正在尝试实现ECC:纠错码/reed-solomon。我尝试将其应用于一个文件,但每次都会分割。我的问题是,它适用于第一次拆分,但随后出现以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8217
at package_name.GF28.mult(GF28.java:73)
at package_name.Encoder.encode(Encoder.java:36)
at package_name.ErrorCodesMain.Ecc(ErrorCodesMain.java:27)
此异常发生在编码前三个拆分后,每个拆分有72字节。 有什么不对劲的建议吗

我试图缩小问题的范围,我发现它来自于构造Galois域的类: 以下是错误发生的地方:

public GF28 mult(char b) {
    if (!multsDone[val][b]) {
        mults[val][b] = mult(val, b);
        mults[b][val] = mults[val][b];
        multsDone[val][b] = true;
        multsDone[b][val] = true;}

    return new GF28(mults[val][b]);
}
这是整个类的代码

package package_name;
import java.util.*;

public class GF28 {
public static char[][] adds;
public static char[][] mults;
public static char[] inverse;
public static boolean[][] addsDone;
public static boolean[][] multsDone;
public static boolean[] inverseDone;

public static final char PX = (char) 0x11B;

public static void init() {
    int max = 1 << 8;
    adds = new char[max][max];
    mults = new char[max][max];
    addsDone = new boolean[max][max];
    multsDone = new boolean[max][max];
    inverse = new char[max];
    inverseDone = new boolean[max];
    for (int i = 0; i < adds.length; i++) {
        inverse[i] = 0;
        inverseDone[i] = false;
        for (int j = 0; j < adds[0].length; j++) {
            adds[i][j] = 0;
            mults[i][j] = 0;
            addsDone[i][j] = false;
            multsDone[i][j] = false;
        }
    }
}

public static char add(char a, char b) {
    return (char) (a ^ b);
}

public static char mult(char a, char b) {
    int p = a;
    int r = 0;
    while (b != 0) {
        if ((b & 1) == 1)
            r = r ^ p;
        b = (char) (b >>> 1);
        p = p << 1;
        if ((p & 0x100) == 0x100)
            p = p ^ PX;
    }
    return (char) r;
}

char val;

public GF28(char val) {
    this.val = val;
}

public GF28 add(char b) {
    if (!addsDone[val][b]) {
        adds[val][b] = add(val, b);
        adds[b][val] = adds[val][b];
        addsDone[val][b] = true;
        addsDone[b][val] = true;
    }
    return new GF28(adds[val][b]);
}

public GF28 add(GF28 b) {
    return add(b.val);
}

public GF28 mult(char b) {
    if (!multsDone[val][b]) {
        mults[val][b] = mult(val, b);
        mults[b][val] = mults[val][b];
        multsDone[val][b] = true;
        multsDone[b][val] = true;}

    return new GF28(mults[val][b]);
}

public GF28 mult(GF28 b) {
    return mult(b.val);
}

public GF28 getInverse() {
    return inverse(val);
}

public static GF28 inverse(char a) {
    if (!inverseDone[a]) {
        GF28 ga = new GF28(a);
        for (char i = 0; i < (1 << 8); i++) {
            if (ga.mult(i).val == 1) {
                inverseDone[a] = true;
                inverseDone[i] = true;
                inverse[a] = i;
                inverse[i] = a;
                break;
            }
        }
    }
    return new GF28(inverse[a]);
}

public static String getBinaryString(char c) {
    String s = "";
    for (int i = 0; i < 8; i++) {
        s = (c % 2) + s;
        c = (char) (c >> 1);
    }
    return "0b" + s;
}

public static ArrayList<Integer> findGenerators() {
    ArrayList<Integer> gs = new ArrayList<Integer>();
    for (int j = 1; j < 1 << 8; j++) {
        GF28 gz = new GF28((char) j);
        HashSet<Character> hs = new HashSet<Character>();
        hs.add(gz.val);
        for (int i = 2; i <= 1 << 8; i++) {
            gz = gz.mult((char) j);
            hs.add(gz.val);
        }
        if (hs.size() == 255)
            gs.add(j);
    }
    return gs;
}
package\u名称;
导入java.util.*;
公共类GF28{
公共静态字符[][]添加;
公共静态字符[][]多个;
公共静态字符[]逆;
公共静态布尔值[][]addsDone;
公共静态布尔[][]multsDone;
公共静态布尔[]逆变;
公共静态最终字符PX=(字符)0x11B;
公共静态void init(){
int max=1>>1);
p=p1);
}
返回“0b”+s;
}
公共静态ArrayList findGenerators(){
ArrayList gs=新的ArrayList();

对于(int j=1;j<1您的程序中有一个错误。我建议您找到显示此错误的最简单示例,并使用调试器逐步完成代码。我缩小了问题的范围,它位于我在帖子中编辑的Galois字段中。您是否有一个简短的示例重现此问题,即我们可以独立运行?您是否尝试使用调试器?I我不熟悉使用调试器。我对java不是很在行。我担心使用IDE和调试器是必不可少的。在这之后,你应该学习使用探查器。