Пример #1
0
 /**
  * <p>Decodes given set of received codewords, which include both data and error-correction
  * codewords. Really, this means it uses Reed-Solomon to detect and correct errors, in-place,
  * in the input.</p>
  *
  * @param received data and error-correction codewords
  * @param twoS number of error-correction codewords available
  * @throws ReedSolomonException if decoding fails for any reason
  */
 public void decode(int[] received, int twoS)
 {
     try{
         GF256Poly poly = new GF256Poly(field, received);
         int[]     syndromeCoefficients = new int[twoS];
         bool      dataMatrix           = field.Equals(GF256.DATA_MATRIX_FIELD);
         bool      noError = true;
         for (int i = 0; i < twoS; i++)
         {
             // Thanks to sanfordsquires for this fix:
             int eval = poly.evaluateAt(field.exp(dataMatrix ? i + 1 : i));
             syndromeCoefficients[syndromeCoefficients.Length - 1 - i] = eval;
             if (eval != 0)
             {
                 noError = false;
             }
         }
         if (noError)
         {
             return;
         }
         GF256Poly   syndrome   = new GF256Poly(field, syndromeCoefficients);
         GF256Poly[] sigmaOmega =
             runEuclideanAlgorithm(field.buildMonomial(twoS, 1), syndrome, twoS);
         GF256Poly sigma           = sigmaOmega[0];
         GF256Poly omega           = sigmaOmega[1];
         int[]     errorLocations  = findErrorLocations(sigma);
         int[]     errorMagnitudes = findErrorMagnitudes(omega, errorLocations, dataMatrix);
         for (int i = 0; i < errorLocations.Length; i++)
         {
             int position = received.Length - 1 - field.log(errorLocations[i]);
             if (position < 0)
             {
                 throw new ReedSolomonException("Bad error location");
             }
             received[position] = GF256.addOrSubtract(received[position], errorMagnitudes[i]);
         }
     }catch (ReedSolomonException e) {
         throw new ReedSolomonException(e.Message);
     }
 }
Пример #2
0
 private GF256Poly buildGenerator(int degree)
 {
     if (degree >= cachedGenerators.Count)
     {
         GF256Poly lastGenerator = (GF256Poly)cachedGenerators[cachedGenerators.Count - 1];
         for (int d = cachedGenerators.Count; d <= degree; d++)
         {
             GF256Poly nextGenerator = lastGenerator.multiply(new GF256Poly(field, new int[] { 1, field.exp(d - 1) }));
             cachedGenerators.Add(nextGenerator);
             lastGenerator = nextGenerator;
         }
     }
     return((GF256Poly)cachedGenerators[degree]);
 }