decode static method
Corrects received in place; returns the number of errors fixed.
Implementation
static int decode(Int32List received, int numEcCodewords, Int32List erasures) {
final Int32List poly = Int32List.fromList(received);
final Int32List syndromes = Int32List(numEcCodewords);
bool error = false;
for (int i = numEcCodewords; i > 0; i--) {
final int evaluated = evaluate(poly, exp(i));
syndromes[numEcCodewords - i] = evaluated;
if (evaluated != 0) error = true;
}
if (!error) return 0;
Int32List knownErrors = Int32List.fromList(<int>[1]);
for (final int erasure in erasures) {
final int b = exp(received.length - 1 - erasure);
knownErrors = multiplyPoly(knownErrors, Int32List.fromList(<int>[subtract(0, b), 1]));
}
final Int32List syndromePoly = trim(syndromes);
final List<Int32List> sigmaOmega = _runEuclidean(monomial(numEcCodewords, 1), syndromePoly, numEcCodewords);
final Int32List sigma = sigmaOmega[0];
final Int32List omega = sigmaOmega[1];
final Int32List positions = _errorLocations(sigma);
final Int32List magnitudes = _errorMagnitudes(omega, sigma, positions);
for (int i = 0; i < positions.length; i++) {
final int position = received.length - 1 - log(positions[i]);
if (position < 0) throw const UCodeDecodeException("Bad PDF417 error location");
received[position] = subtract(received[position], magnitudes[i]);
}
return positions.length;
}