119 lines
4.4 KiB
Java
119 lines
4.4 KiB
Java
package com.google.zxing.common.reedsolomon;
|
|
|
|
/* loaded from: classes.dex */
|
|
public final class ReedSolomonDecoder {
|
|
private final GenericGF a;
|
|
|
|
public ReedSolomonDecoder(GenericGF genericGF) {
|
|
this.a = genericGF;
|
|
}
|
|
|
|
public void a(int[] iArr, int i) throws ReedSolomonException {
|
|
GenericGFPoly genericGFPoly = new GenericGFPoly(this.a, iArr);
|
|
int[] iArr2 = new int[i];
|
|
boolean z = true;
|
|
for (int i2 = 0; i2 < i; i2++) {
|
|
GenericGF genericGF = this.a;
|
|
int a = genericGFPoly.a(genericGF.a(genericGF.a() + i2));
|
|
iArr2[(i - 1) - i2] = a;
|
|
if (a != 0) {
|
|
z = false;
|
|
}
|
|
}
|
|
if (z) {
|
|
return;
|
|
}
|
|
GenericGFPoly[] a2 = a(this.a.a(i, 1), new GenericGFPoly(this.a, iArr2), i);
|
|
GenericGFPoly genericGFPoly2 = a2[0];
|
|
GenericGFPoly genericGFPoly3 = a2[1];
|
|
int[] a3 = a(genericGFPoly2);
|
|
int[] a4 = a(genericGFPoly3, a3);
|
|
for (int i3 = 0; i3 < a3.length; i3++) {
|
|
int length = (iArr.length - 1) - this.a.c(a3[i3]);
|
|
if (length < 0) {
|
|
throw new ReedSolomonException("Bad error location");
|
|
}
|
|
iArr[length] = GenericGF.c(iArr[length], a4[i3]);
|
|
}
|
|
}
|
|
|
|
private GenericGFPoly[] a(GenericGFPoly genericGFPoly, GenericGFPoly genericGFPoly2, int i) throws ReedSolomonException {
|
|
if (genericGFPoly.b() < genericGFPoly2.b()) {
|
|
genericGFPoly2 = genericGFPoly;
|
|
genericGFPoly = genericGFPoly2;
|
|
}
|
|
GenericGFPoly d = this.a.d();
|
|
GenericGFPoly b = this.a.b();
|
|
do {
|
|
GenericGFPoly genericGFPoly3 = genericGFPoly2;
|
|
genericGFPoly2 = genericGFPoly;
|
|
genericGFPoly = genericGFPoly3;
|
|
GenericGFPoly genericGFPoly4 = b;
|
|
GenericGFPoly genericGFPoly5 = d;
|
|
d = genericGFPoly4;
|
|
if (genericGFPoly.b() >= i / 2) {
|
|
if (!genericGFPoly.c()) {
|
|
GenericGFPoly d2 = this.a.d();
|
|
int b2 = this.a.b(genericGFPoly.b(genericGFPoly.b()));
|
|
while (genericGFPoly2.b() >= genericGFPoly.b() && !genericGFPoly2.c()) {
|
|
int b3 = genericGFPoly2.b() - genericGFPoly.b();
|
|
int b4 = this.a.b(genericGFPoly2.b(genericGFPoly2.b()), b2);
|
|
d2 = d2.a(this.a.a(b3, b4));
|
|
genericGFPoly2 = genericGFPoly2.a(genericGFPoly.a(b3, b4));
|
|
}
|
|
b = d2.c(d).a(genericGFPoly5);
|
|
} else {
|
|
throw new ReedSolomonException("r_{i-1} was zero");
|
|
}
|
|
} else {
|
|
int b5 = d.b(0);
|
|
if (b5 != 0) {
|
|
int b6 = this.a.b(b5);
|
|
return new GenericGFPoly[]{d.c(b6), genericGFPoly.c(b6)};
|
|
}
|
|
throw new ReedSolomonException("sigmaTilde(0) was zero");
|
|
}
|
|
} while (genericGFPoly2.b() < genericGFPoly.b());
|
|
throw new IllegalStateException("Division algorithm failed to reduce polynomial?");
|
|
}
|
|
|
|
private int[] a(GenericGFPoly genericGFPoly) throws ReedSolomonException {
|
|
int b = genericGFPoly.b();
|
|
int i = 0;
|
|
if (b == 1) {
|
|
return new int[]{genericGFPoly.b(1)};
|
|
}
|
|
int[] iArr = new int[b];
|
|
for (int i2 = 1; i2 < this.a.c() && i < b; i2++) {
|
|
if (genericGFPoly.a(i2) == 0) {
|
|
iArr[i] = this.a.b(i2);
|
|
i++;
|
|
}
|
|
}
|
|
if (i == b) {
|
|
return iArr;
|
|
}
|
|
throw new ReedSolomonException("Error locator degree does not match number of roots");
|
|
}
|
|
|
|
private int[] a(GenericGFPoly genericGFPoly, int[] iArr) {
|
|
int length = iArr.length;
|
|
int[] iArr2 = new int[length];
|
|
for (int i = 0; i < length; i++) {
|
|
int b = this.a.b(iArr[i]);
|
|
int i2 = 1;
|
|
for (int i3 = 0; i3 < length; i3++) {
|
|
if (i != i3) {
|
|
int b2 = this.a.b(iArr[i3], b);
|
|
i2 = this.a.b(i2, (b2 & 1) == 0 ? b2 | 1 : b2 & (-2));
|
|
}
|
|
}
|
|
iArr2[i] = this.a.b(genericGFPoly.a(b), this.a.b(i2));
|
|
if (this.a.a() != 0) {
|
|
iArr2[i] = this.a.b(iArr2[i], b);
|
|
}
|
|
}
|
|
return iArr2;
|
|
}
|
|
}
|