/// <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));
    }
Ejemplo n.º 2
0
        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);
            }
        }