/// <summary> /// Encode an array of data codeword with GaloisField 256. /// </summary> /// <param name="dataBytes">Array of data codewords for a single block.</param> /// <param name="numECBytes">Number of error correction codewords for data codewords</param> /// <param name="generatorPoly">Cached or newly create GeneratorPolynomial</param> /// <returns>Return error correction codewords array</returns> internal static byte[] Encode(byte[] dataBytes, int numECBytes, GeneratorPolynomial generatorPoly) { int dataLength = dataBytes.Length; Guard.NotNull(nameof(generatorPoly), generatorPoly); if (dataLength == 0) { throw new ArgumentException("There is no data bytes to encode."); } if (numECBytes <= 0) { throw new ArgumentException("No Error Correction bytes."); } int[] toEncode = ConvertToIntArray(dataBytes, dataLength, numECBytes); Polynomial generator = generatorPoly.GetGenerator(numECBytes); Polynomial dataPoly = new(generator.GField, toEncode); PolyDivideStruct divideResult = dataPoly.Divide(generator); int[] remainderCoeffs = divideResult.Remainder.Coefficients; return(ConvertTosByteArray(remainderCoeffs, numECBytes)); }
private void TestOneCase(int[] aCoeff, int[] bCoeff, int[] expQuotient, int[] expRemainder) { GaloisField256 gfield = GaloisField256.QRCodeGaloisField; Polynomial apoly = new Polynomial(gfield, aCoeff); Polynomial bpoly = new Polynomial(gfield, bCoeff); PolyDivideStruct pds = apoly.Divide(bpoly); int[] quotient = pds.Quotient.Coefficients; int[] remainder = pds.Remainder.Coefficients; if (!PolynomialExtensions.isEqual(quotient, expQuotient)) { Assert.Fail("Quotient not equal. Result {0}, Expect {1}", aCoeff.Length, bCoeff.Length); } if (!PolynomialExtensions.isEqual(remainder, expRemainder)) { Assert.Fail("Remainder not equal. Result {0}, Expect {1}", remainder.Length, aCoeff.Length); } }