private static DecoderResult createDecoderResultFromAmbiguousValues(int ecLevel,int[] codewords,int[] erasureArray,int[] ambiguousIndexes,int[][] ambiguousIndexValues) throws FormatException, ChecksumException {
  int[] ambiguousIndexCount=new int[ambiguousIndexes.length];
  int tries=100;
  while (tries-- > 0) {
    for (int i=0; i < ambiguousIndexCount.length; i++) {
      codewords[ambiguousIndexes[i]]=ambiguousIndexValues[i][ambiguousIndexCount[i]];
    }
    try {
      return decodeCodewords(codewords,ecLevel,erasureArray);
    }
 catch (    ChecksumException ignored) {
    }
    if (ambiguousIndexCount.length == 0) {
      throw ChecksumException.getChecksumInstance();
    }
    for (int i=0; i < ambiguousIndexCount.length; i++) {
      if (ambiguousIndexCount[i] < ambiguousIndexValues[i].length - 1) {
        ambiguousIndexCount[i]++;
        break;
      }
 else {
        ambiguousIndexCount[i]=0;
        if (i == ambiguousIndexCount.length - 1) {
          throw ChecksumException.getChecksumInstance();
        }
      }
    }
  }
  throw ChecksumException.getChecksumInstance();
}

private static DecoderResult createDecoderResultFromAmbiguousValues ( int ecLevel , int [ ] codewords , int [ ] erasureArray , int [ ] ambiguousIndexes , int [ ] [ ] ambiguousIndexValues ) throws FormatException , ChecksumException { int [ ] ambiguousIndexCount = new int [ ambiguousIndexes . length ] ; int tries = 100 ; while ( tries -- > 0 ) { for ( int i = 0 ; i < ambiguousIndexCount . length ; i ++ ) { codewords [ ambiguousIndexes [ i ] ] = ambiguousIndexValues [ i ] [ ambiguousIndexCount [ i ] ] ; } try { return decodeCodewords ( codewords , ecLevel , erasureArray ) ; } catch ( ChecksumException ignored ) { } if ( ambiguousIndexCount . length == 0 ) { throw ChecksumException . getChecksumInstance ( ) ; } for ( int i = 0 ; i < ambiguousIndexCount . length ; i ++ ) { if ( ambiguousIndexCount [ i ] < ambiguousIndexValues [ i ] . length - 1 ) { ambiguousIndexCount [ i ] ++ ; break ; } else { ambiguousIndexCount [ i ] = 0 ; if ( i == ambiguousIndexCount . length - 1 ) { throw ChecksumException . getChecksumInstance ( ) ; } } } } throw ChecksumException . getChecksumInstance ( ) ; }
this method deals with the fact , that the decoding process doesn ' t always yield a single most likely value . the current error correction implementation doesn ' t deal with erasures very well , so it ' s better to provide a value for these ambiguous codewords instead of treating it as an erasure . the problem is that we don ' t know which of the ambiguous values to choose . we try decode using the first value , and if that fails , we use another of the ambiguous values and try to decode again . this usually only happens on very hard to read and decode barcodes , so decoding the normal barcodes is not affected by this .
