/// <summary> /// /// </summary> /// <param name="targetX">X[i]</param> /// <param name="targetY">Y[i]</param> /// <param name="expression"></param> /// <returns></returns> public static int Generate(ref ulong Hash, ref ulong Seed, ref ulong limitDeOperações, ref byte[] X, ref byte[] Y, out string expression) { string stringOperation = string.Empty; List <Operação> Operações = new List <Operação>(); ulong elementsAdded = 0; ulong insideTry = 0; for (ulong operações = 0; operações < limitDeOperações; operações++) { Operação op = new Operação(); char Operador = GetOperand(true, Seed, ref insideTry, ref elementsAdded); stringOperation += "("; op.A = GenerateVariável(Seed, ref insideTry, ref elementsAdded, ref X, ref Y); if (Operador == Operands[6]) // ~ NOT { op.A.Value = (byte)((~op.A.Value) & 255); stringOperation += Operador + VariáveltoExpression(op.A) + " "; Operador = GetOperand(false, Seed, ref insideTry, ref elementsAdded); } else { stringOperation += VariáveltoExpression(op.A) + " "; } op.B = GenerateVariável(Seed, ref insideTry, ref elementsAdded, ref X, ref Y); stringOperation += Operador + " " + VariáveltoExpression(op.B) + " "; // op.Resultado = (byte)(operators[Operador](op.A.Value, op.B.Value) % 256); op.Resultado = (byte)(CalcularOperação(Operador, new int[] { op.A.Value, op.B.Value }) % 256); op.Operador = Operador; Operações.Add(op); stringOperation += ") "; if (operações + 1 < limitDeOperações) { Operações.Add(new Operação() { Operador = GetOperand(false, Seed, ref insideTry, ref elementsAdded) }); stringOperation += Operações[Operações.Count - 1].Operador + " "; } } // Agora calcular o resultado da expressão int resultado = CalcularResultadoOperações(Operações); expression = stringOperation; return(resultado); }
private static int CalcularResultadoOperações(List <Operação> Operações) { // Agora calcular o resultado da expressão aindaHáOperações: List <Operação> temp = new List <Operação>(); for (int i = 0; i < Operações.Count; i++) { Operação a = Operações[i]; i++; char operador = Operações[i].Operador; i++; Operação b = Operações[i]; Operação resultado = new Operação(); // resultado.Resultado = (byte)(operators[operador](a.Resultado, b.Resultado) % 256); resultado.Resultado = (byte)(CalcularOperação(operador, new int[] { a.Resultado, b.Resultado }) % 256); temp.Add(resultado); if (i == Operações.Count - 1) { break; } i++; temp.Add(Operações[i]); } if (temp.Count != 1) { Operações = temp; goto aindaHáOperações; } return((byte)temp[0].Resultado); }
public static int Calculate(byte[] compareX, byte[] compareY, ref string expression) { List <Operação> Operações = new List <Operação>(); // Vars = new List<Variável>(); StringReader Reader = new StringReader(expression.Replace(" ", "")); bool B = false; char c = (char)Reader.Peek(); while (Reader.Peek() != -1) { c = (char)Reader.Peek(); if (c == '(') { Operação op = new Operação(); // (~X[10] ^ ~Y[21] ) ^ (~Y[9] & ~X[24] ) Reader.Read(); VOLTA: c = (char)Reader.Peek(); if (c == '~') { Reader.Read(); char Letra = (char)Reader.Peek(); Reader.Read(); // [ Reader.Read(); // index string numero = string.Empty; int index = 0; while (char.IsNumber((char)Reader.Peek())) { numero += (char)Reader.Peek(); Reader.Read(); } index = int.Parse(numero); Reader.Read(); // ] if (!B) { op.A = GetVariável(ref compareX, ref compareY, Letra, index, true); // if(Vars != null) // Vars.Add(op.A); B = true; goto VOLTA; } else // A já foi prenchido, agora B { op.B = GetVariável(ref compareX, ref compareY, Letra, index, true); // if (Vars != null) // Vars.Add(op.B); } Reader.Read(); // ) if (B) { Operações.Add(op); // op.Resultado = (byte)(operators[op.Operador](op.A.Value, op.B.Value) % 256); op.Resultado = (byte)(CalcularOperação(op.Operador, new int[] { op.A.Value, op.B.Value }) % 256); B = false; continue; } } else if (IsOperand(c)) { op.Operador = c; Reader.Read(); goto VOLTA; } else { char Letra = (char)Reader.Peek(); Reader.Read(); // [ Reader.Read(); // index string numero = string.Empty; int index = 0; while (char.IsNumber((char)Reader.Peek())) { numero += (char)Reader.Peek(); Reader.Read(); } index = int.Parse(numero); Reader.Read(); // ] if (!B) { op.A = GetVariável(ref compareX, ref compareY, Letra, index); // if (Vars != null) // Vars.Add(op.A); B = true; goto VOLTA;; } else // A já foi prenchido, agora B { op.B = GetVariável(ref compareX, ref compareY, Letra, index); // if (Vars != null) // Vars.Add(op.B); } Reader.Read(); // ) if (B) { //op.Resultado = (byte)(operators[op.Operador](op.A.Value, op.B.Value) % 256); op.Resultado = (byte)(CalcularOperação(op.Operador, new int[] { op.A.Value, op.B.Value }) % 256); Operações.Add(op); B = false; continue; } } } else if (IsOperand(c)) { Operações.Add(new Operação() { Operador = c }); Reader.Read(); // ( } } return(CalcularResultadoOperações(Operações)); }