Java ECC中的例外
我正在尝试实现ECC:纠错码/reed-solomon。我尝试将其应用于一个文件,但每次都会分割。我的问题是,它适用于第一次拆分,但随后出现以下错误: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
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和调试器是必不可少的。在这之后,你应该学习使用探查器。