Soy de los que leen mucho pero no puedo aportar nada, por falta de conocimientos, pero aquí pongo mi modesta solución para algo a lo que no conseguí encontrar solución en el foro o las que había no me resolvían lo que yo necesitaba, que era convertir una cadena hexadecimal (en formato string) a decimal.
Por diversos motivos al usar un modulo rfid-rc522 necesitaba, que según que software usara el arduino, enviara los códigos de uid de la tarjeta de una manera u otra y en formato decimal para un caso.
Se que esta manera no es la más bonita, ni la más profesional ,ni me siento orgulloso, pero si soluciona mi problema y lleva funcionando una semana sin incidencias. me gustaría mucho mejorarlo acepto críticas.
Este codigo lo que hace es convertir una cadena Hexadecimal a decimal para enviarlo por el puerto serial.
String strToDecimal(String cadena){
unsigned long SumaTotal= 0;
unsigned long Pot = 0;
unsigned long multiplo = 0;
int z;
String letra;
for (int x = cadena.length()-1;x>=0;x--){
z = (cadena.length()-x-1);
Pot = 1;
for (int y =0; y < z ; y++){
Pot *= 16;
}
letra = cadena[x];
if (letra == "1"){
multiplo = 1;
}else if (letra == "2"){
multiplo = 2;
}else if (letra == "3"){
multiplo = 3;
}else if (letra == "4"){
multiplo = 4;
}else if (letra == "5"){
multiplo = 5;
}else if (letra == "6"){
multiplo = 6;
}else if (letra == "7"){
multiplo = 7;
}else if (letra == "8"){
multiplo = 8;
}else if (letra == "9"){
multiplo = 9;
}else if (letra == "a" || letra == "A"){
multiplo = 10;
} else if (letra == "b" || letra == "B"){
multiplo = 11;
} else if (letra == "c" || letra == "C"){
multiplo = 12;
} else if (letra == "d" || letra == "D"){
multiplo = 13;
} else if (letra == "e" || letra == "E"){
multiplo = 14;
} else if (letra == "f" || letra == "F") {
multiplo = 15;
}
SumaTotal += (Pot * multiplo);
}
return String(SumaTotal);
}
Bueno es que yo soy muy rápido.. pero te agradezco el haberlo hecho.
Lo primero que haría es algo mas simple.. y es usar los valores ASCII para convertir lo que quiero
Esto
if (letra == "1"){
multiplo = 1;
}else if (letra == "2"){
multiplo = 2;
}else if (letra == "3"){
multiplo = 3;
}else if (letra == "4"){
multiplo = 4;
}else if (letra == "5"){
multiplo = 5;
}else if (letra == "6"){
multiplo = 6;
}else if (letra == "7"){
multiplo = 7;
}else if (letra == "8"){
multiplo = 8;
}else if (letra == "9"){
multiplo = 9;
}else if (letra == "a" || letra == "A"){
multiplo = 10;
} else if (letra == "b" || letra == "B"){
multiplo = 11;
} else if (letra == "c" || letra == "C"){
multiplo = 12;
} else if (letra == "d" || letra == "D"){
multiplo = 13;
} else if (letra == "e" || letra == "E"){
multiplo = 14;
} else if (letra == "f" || letra == "F") {
multiplo = 15;
}
lo cambio por esto
if (isDigit(letra))
multiplo = letra-'0'; // Al quitarle '0' te queda 0.. 9
else // no es digito
multiplo = letra - 'A'+10;
Se que hay una conversión mas directa pero no la recuerdo.
surbyte:
Bueno es que yo soy muy rápido.. pero te agradezco el haberlo hecho.
Lo primero que haría es algo mas simple.. y es usar los valores ASCII para convertir lo que quiero
Esto
if (letra == "1"){
multiplo = 1;
}else if (letra == "2"){
multiplo = 2;
}else if (letra == "3"){
multiplo = 3;
}else if (letra == "4"){
multiplo = 4;
}else if (letra == "5"){
multiplo = 5;
}else if (letra == "6"){
multiplo = 6;
}else if (letra == "7"){
multiplo = 7;
}else if (letra == "8"){
multiplo = 8;
}else if (letra == "9"){
multiplo = 9;
}else if (letra == "a" || letra == "A"){
multiplo = 10;
} else if (letra == "b" || letra == "B"){
multiplo = 11;
} else if (letra == "c" || letra == "C"){
multiplo = 12;
} else if (letra == "d" || letra == "D"){
multiplo = 13;
} else if (letra == "e" || letra == "E"){
multiplo = 14;
} else if (letra == "f" || letra == "F") {
multiplo = 15;
}
lo cambio por esto
if (isDigit(letra))
multiplo = letra-'0'; // Al quitarle '0' te queda 0.. 9
else // no es digito
multiplo = letra - 'A'+10;
Se que hay una conversión mas directa pero no la recuerdo.
Basándome en tu idea, he cambiado esa parte por esta otra.
if (isDigit(cadena[x]))
multiplo = int(cadena[x])-48;
else // no es digito
multiplo = int(cadena[x])-55;
la única cosa es tener la precaución de poner todas las letras en mayusculas para que siempre pille los mismos caracteres.
cadena.toUpperCase();
Después de tu sugerencia se acorta al código a esto.
String strToDecimal(String cadena){
unsigned long SumaTotal= 0;
unsigned long Pot = 0;
unsigned long multiplo = 0;
int z;
cadena.toUpperCase();
for (int x = cadena.length()-1;x>=0;x--){
z = (cadena.length()-x-1);
Pot = 1;
for (int y =0; y < z ; y++){
Pot *= 16;
}
if (isDigit(cadena[x]))
multiplo = int(cadena[x])-48;
else // no es digito
multiplo = int(cadena[x])-55;
SumaTotal += (Pot * multiplo);
}
return String(SumaTotal);
}