como pasar un string en hexadecimal a decimal.

Hola muy buenas a todos.

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

Primero como debo postear para que el moderador no me llame la atención.
lee las normas del foro y edita lo que acabas de postear.

surbyte:
Primero como debo postear para que el moderador no me llame la atención.
lee las normas del foro y edita lo que acabas de postear.

Me di cuenta del fallo al postearlo y me dice que tengo que esperar 5 minutos para poder editarlo.

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.

Gracias por tu sugerencia y me ha dado una idea.

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

Muchas gracias por la idea queda ya algo mejor.

1 Like

Acabo de descubrir esto que sabía que existía pero no lo encontraba

int multiplo = StrToHex(letra);

int StrToHex(char str[]) {
  return (int) strtol(str, 0, 16);
}

simplifica todo no?

Hola muy buenas

Muchísimas gracias ya que tu código con un retoque tonto (por cuestión de tamaño de los números) funciona perfectamente.

Si dejamos el código original quedaría

int StrToHex(char str[]) {
    return (int) strtol(str, 0, 16);
}

Y el resultado que da se ve que se queda corto

Hexadecimal: 1F6AA99A 
    Decimal: 527083930
   StrToHex: -22118

Con este cambio tonto que es ponerlo a long ya funciona perfectamente.

 long StrToHex(char str[]) {
    return (long) strtol(str, 0, 16);
  }
Hexadecimal: 1F6AA99A 
    Decimal: 527083930
   StrToHex: 527083930

El resultado total con ejemplo incluido

void setup() {
  Serial.begin(9600); 
  Serial.println("Hexadecimal: 1F6AA99A ");
  Serial.println("    Decimal: 527083930");

  long multiplo = StrToHex("1F6AA99A");
  Serial.print("   StrToHex: ");
  Serial.println(multiplo, DEC);
}

 


void loop() {
  // put your main code here, to run repeatedly:
  
}

long StrToHex(char str[]) {
    return (long) strtol(str, 0, 16);
}

surbyte:
Acabo de descubrir esto que sabía que existía pero no lo encontraba

int multiplo = StrToHex(letra);

int StrToHex(char str[]) {
 return (int) strtol(str, 0, 16);
}



simplifica todo no?