public void Encode(byte[] message)
        {
            byte z_0;
            byte r;

            byte[] z = this.modTempResult;
            byte[] g = this.codeGenPoly;

            // ------------ Init ----------

            Array.Clear(message, 0, this.checkwords);

            Array.Clear(z, 0, z.Length);

            z_0 = 0;

            for (int i = message.Length - 1; i > this.checkwords; i--)
            {
                r = (byte)(z_0 ^ message[i]);

                for (int zIter = 0; zIter < z.Length; zIter++)
                {
                    z[zIter] ^= gf.Multiply(g[zIter], r);
                }

                z_0 = z[z.Length - 1];

                for (int zIter = z.Length - 1; zIter >= 1; zIter--)
                {
                    z[zIter] = z[zIter - 1];
                }

                z[0] = 0;
            }

            r = (byte)(z_0 ^ message[this.checkwords]);

            for (int zIter = 0; zIter < z.Length; zIter++)
            {
                z[zIter] ^= gf.Multiply(g[zIter], r);
            }

            for (int i = 0; i < z.Length; i++)
            {
                message[i] = z[i];
            }
        }
        private void RepairErrors(byte[] message, byte[] errorIndexes, byte[] omega, byte[] lp)
        {
            byte top;
            byte bottom;
            byte x;
            byte xInverse;
            int  messageLen = message.Length;

            for (int i = 0; i < messageLen; i++)
            {
                if (errorIndexes[i] == 0)
                {
                    x = gf.Field[i + 1];

                    xInverse = gf.Inverses[x];

                    top    = gf.PolyEval(omega, xInverse);
                    top    = gf.Multiply(top, x);
                    bottom = gf.PolyEval(lp, xInverse);

                    message[i] ^= gf.Divide(top, bottom);
                }
            }
        }