Fíjate en este código usando char* y funciones C:
Código PHP:
bool FuerzaBruta(char* Serial, char* Salida, char* Rango)
{
int L = strlen(Serial);
int R = strlen(Rango);
int n;
for(n=0; n<L; n++) Salida[n] = *Rango;
Salida[n] = 0;
for(n=0; n<L; n++){
for(int r=0; r<R; r++){
Salida[n] = Rango[r];
if(Salida[n] == Serial[n]) break;
}
}
}
//--------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
char* Rango = "0123456789ABCDEF";
char* Serial = "FAAF"; //Cadena hexa a buscar. No puede ser mayor que "FFFFFFFF"
char* Salida = new char[strlen(Serial)+1];
bool retval;
bool error=false; //bandera para la verificacion de la cadena
double tiempoInicial, tiempoFinal;
//Podemos asegurarnos de que el valor de cadena es hexa antes de seguir para evitar problemas
for(int i = 0; i < strlen(Serial) && error != true; i++)
{
if(!isalnum(Serial[i])){
ShowMessage(AnsiString().sprintf("La cadena %s no es hexadecimal", Serial));
error = true;
}
}
//Tambien deberiamos asegurarnos de que el largo de la cadena no exceda del maximo
if(strlen(Serial) > 8)
{
ShowMessage(AnsiString().sprintf("El largo de cadena excede del largo máximo.\nLargo actual: %d\nLargo máximo permitido: %d", strlen(Serial),8));
error = true;
}
if(error != true) //Si no se produjo ningun error seguimos adelante
{
Form1->WindowState = wsMinimized; //Minimizamos el form para que el usuario no pueda pulsar el boton ni nada
tiempoInicial = GetTickCount(); //Obtenemos el tiempo de entrada
retval = FuerzaBruta(Serial, Salida, Rango);
if(retval == false){ //Si no se encontró avisamos
ShowMessage("No se encontró el valor");
}else{
tiempoFinal = GetTickCount(); //obtenemos el tiempo de salida
ShowMessage( AnsiString().sprintf( "Valor hexadecimal: %s\n"
"Se han tardado %s segundos en encontrarlo.",
Salida, FormatFloat("0.000",(tiempoFinal - tiempoInicial) /1000)));
}
Form1->WindowState = wsNormal; //volvemos a restaurar el form
}
delete [] Salida;
}
Saludos.