decode static method

int decode(
  1. Int32List received,
  2. int numEcCodewords,
  3. Int32List erasures
)

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;
}