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); } } }