public ReedSolomonEncoder(GenericGF field)
 {
     if (!GenericGF.QR_CODE_FIELD_256.Equals(field))
     {
       throw new System.ArgumentException("Only QR Code is supported at this time");
     }
     this.field = field;
     this.cachedGenerators = new List<GenericGFPoly>();
     cachedGenerators.Add(new GenericGFPoly(field, new int[]{1}));
 }
Ejemplo n.º 2
0
 private static void testDecoder(GenericGF field, int[] dataWords, int[] ecWords)
 {
    ReedSolomonDecoder decoder = new ReedSolomonDecoder(field);
    int[] message = new int[dataWords.Length + ecWords.Length];
    int maxErrors = ecWords.Length / 2;
    Random random = getPseudoRandom();
    int iterations = field.Size > 256 ? 1 : DECODER_TEST_ITERATIONS;
    for (int j = 0; j < iterations; j++)
    {
       for (int i = 0; i < ecWords.Length; i++)
       {
          if (i > 10 && i < ecWords.Length / 2 - 10)
          {
             // performance improvement - skip intermediate cases in long-running tests 
             i += ecWords.Length / 10;
          }
          Array.Copy(dataWords, 0, message, 0, dataWords.Length);
          Array.Copy(ecWords, 0, message, dataWords.Length, ecWords.Length);
          corrupt(message, i, random, field.Size);
          if (!decoder.decode(message, ecWords.Length))
          {
             // fail only if maxErrors exceeded
             Assert.IsTrue(i > maxErrors, "Decode in " + field + " (" + dataWords.Length + ',' + ecWords.Length + ") failed at " + i);
             // else stop
             break;
          }
          if (i < maxErrors)
          {
             assertDataEquals("Decode in " + field + " (" + dataWords.Length + ',' + ecWords.Length + ") failed at " +
                              i + " errors",
                              dataWords,
                              message);
          }
       }
    }
 }
Ejemplo n.º 3
0
 private static void testEncoder(GenericGF field, int[] dataWords, int[] ecWords)
 {
    ReedSolomonEncoder encoder = new ReedSolomonEncoder(field);
    int[] messageExpected = new int[dataWords.Length + ecWords.Length];
    int[] message = new int[dataWords.Length + ecWords.Length];
    Array.Copy(dataWords, 0, messageExpected, 0, dataWords.Length);
    Array.Copy(ecWords, 0, messageExpected, dataWords.Length, ecWords.Length);
    Array.Copy(dataWords, 0, message, 0, dataWords.Length);
    encoder.encode(message, ecWords.Length);
    assertDataEquals("Encode in " + field + " (" + dataWords.Length + ',' + ecWords.Length + ") failed",
                     messageExpected, message);
 }
Ejemplo n.º 4
0
 private static void testEncodeDecode(GenericGF field, int[] dataWords, int[] ecWords)
 {
    testEncoder(field, dataWords, ecWords);
    testDecoder(field, dataWords, ecWords);
 }
Ejemplo n.º 5
0
 private static void testEncodeDecodeRandom(GenericGF field, int dataSize, int ecSize)
 {
    Assert.IsTrue(dataSize > 0 && dataSize <= field.Size - 3, "Invalid data size for " + field);
    Assert.IsTrue(ecSize > 0 && ecSize + dataSize <= field.Size, "Invalid ECC size for " + field);
    ReedSolomonEncoder encoder = new ReedSolomonEncoder(field);
    int[] message = new int[dataSize + ecSize];
    int[] dataWords = new int[dataSize];
    int[] ecWords = new int[ecSize];
    Random random = getPseudoRandom();
    int iterations = field.Size > 256 ? 1 : DECODER_RANDOM_TEST_ITERATIONS;
    for (int i = 0; i < iterations; i++)
    {
       // generate random data
       for (int k = 0; k < dataSize; k++)
       {
          dataWords[k] = random.Next(field.Size);
       }
       // generate ECC words
       Array.Copy(dataWords, 0, message, 0, dataWords.Length);
       encoder.encode(message, ecWords.Length);
       Array.Copy(message, dataSize, ecWords, 0, ecSize);
       // check to see if Decoder can fix up to ecWords/2 random errors
       testDecoder(field, dataWords, ecWords);
    }
 }
 public ReedSolomonDecoder(GenericGF field)
 {
     this.field = field;
 }
Ejemplo n.º 7
0
 public ReedSolomonDecoder(GenericGF field)
 {
     this.field = field;
 }
Ejemplo n.º 8
0
 public ErasureCoding()
 {
     _field = new GenericGF(285, 256, 0);
 }
 public ReedSolomonEncoder(GenericGF field)
 {
     this.field            = field;
     this.cachedGenerators = new List <GenericGFPoly>();
     cachedGenerators.Add(new GenericGFPoly(field, new int[] { 1 }, true));
 }
Ejemplo n.º 10
0
 private static void testEncodeDecode(GenericGF field, int[] dataWords, int[] ecWords)
 {
     testEncoder(field, dataWords, ecWords);
     testDecoder(field, dataWords, ecWords);
 }