TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: RedPic en 24 de Mayo de 2007, 08:34:06

Título: De un String Hex a un Entero (8,16 o 32 bits)
Publicado por: RedPic en 24 de Mayo de 2007, 08:34:06
Por motivos que no vienen al caso tengo que recibir cadenas ASCII (strings) con valores hexadecimales y converitr su contenido a variables enteras de 8, 16 e incluso 32 bits.

Una vez hechas las funciones necesarias y probadas en su entorno natural encuentro que funcionan (valga la redundancia) así que aquí las tenéis por si a alguien le hacen falta para algo ... (hasta es posible que casi que sí)

Código: CSS
  1. /** \brief Función que convierte un carácter Hexadecimal ASCII a su valor entero de 8 bits.
  2.   *
  3.   * \param d Caracter Hexadecimal a convertir.
  4.   *
  5.   * \return int8 Valor numérico.
  6.   */
  7. int8 ascii_to_hex(char d){
  8.  
  9.    int r=0x00;
  10.  
  11.    if(isxdigit(d)){
  12.       if(isdigit(d)){
  13.          r=d-'0';
  14.       }
  15.       if(isalpha(d)){
  16.          d=toupper(d);
  17.          r=10+(d-'A');
  18.       }
  19.    }
  20.    return(r);
  21. }
  22.  
  23. /** \brief Función que convierte un string numérico Hexadecimal ASCII NULL-END a su valor entero de 8 bits.
  24.   *
  25.   * \param pF Puntero al buffer que contiene el string numérico ASCII Hexadecimal de 2 digitos (00h a FFh).
  26.   *
  27.   * \return int8 Valor numérico.
  28.   */
  29. int8 hex_to_int8(char* pF){
  30.  
  31.    int8 i,ret;
  32.  
  33.    ret=0;
  34.    for(i=1;i!=255;i--){
  35.       ret+=ascii_to_hex(pF[i])*((15*(1-i))+1);
  36.    }
  37.    return ret;
  38. }
  39.  
  40. /** \brief Función que convierte un string numérico Hexadecimal ASCII NULL-END a su valor entero de 16 bits.
  41.   *
  42.   * \param pF Puntero al buffer que contiene el string numérico ASCII Hexadecimal de 4 digitos (0000h a FFFFh).
  43.   *
  44.   * \return int16 Valor numérico.
  45.   */
  46. int16 hex_to_int16(char* pF){
  47.  
  48.    int8  i, p2, p1;
  49.    int16 ret;
  50.  
  51.    p1=hex_to_int8(&pF[2]);
  52.    p2=hex_to_int8(&pF[0]);
  53.    ret=make16(p2,p1);
  54.    return ret;
  55. }
  56. /** \brief Función que convierte un string numérico Hexadecimal ASCII NULL-END a su valor entero de 32 bits.
  57.   *
  58.   * \param pF Puntero al buffer que contiene el string numérico ASCII Hexadecimal de 8 digitos (00000000h a FFFFFFFFh).
  59.   *
  60.   * \return int32 Valor numérico.
  61.   */
  62. int32 hex_to_int32(char* pF){
  63.  
  64.    int32 ret;
  65.    int16 p1,p2;
  66.  
  67.    p1=hex_to_int16(&pF[4]);
  68.    p2=hex_to_int16(&pF[0]);
  69.    ret = make32(p2, p1);
  70.    return ret;
  71. }

Título: Re: De un String Hex a un Entero (8,16 o 32 bits)
Publicado por: Nocturno en 24 de Mayo de 2007, 08:49:29
No acabo de pillarle la lógica a este for, Don Diego

Código: C
  1. for(i=1;i!=255;i--){
  2.       ret+=ascii_to_hex(pF[i])*((15*(1-i))+1);
  3.    }

¿empieza en 1, acaba en 255 y cuenta p'atrás?
Título: Re: De un String Hex a un Entero (8,16 o 32 bits)
Publicado por: MGLSOFT en 27 de Mayo de 2007, 02:39:01
Son dos posiciones...

i vale 1 en la primer ronda, 0 en la segunda y 255 en la tercera...no hay -1 en un byte.. :mrgreen: :mrgreen:
Título: Re: De un String Hex a un Entero (8,16 o 32 bits)
Publicado por: RedPic en 28 de Mayo de 2007, 02:37:42
Exacto MGLSOFT.

Esta rutina solo trata dos caracteres hex, el pF[0] y el pF[1]. Que podría haberlos puesto directamente sin necesidad de un bucle for.

Lo que ocurre es que originalmente esta rutina iba a tratar todos los string hex, sin limitación de longitud, multiplicando cada valor del caracter hex por su peso según su posición dentro del string (1,16,256,4096 ...etc).

Pero me di cuenta de que entonces tendría que devolver el resultado sobre una variable de 32 bits siempre ya que hasta ese valor iba a necesitarla ...

Asi que las dividí en distintas rutinas según el resultado a devolver:

int32 hex_to_int32() que realiza dos conversiones consecutivas de int16 hex_to_int16() que a su vez realiza dos conversiones consecutivas de int8 hex_to_int8() que a su vez realiza dos conversiones consecutivas de int8 ascii_to_hex() que es la única que realiza realmente alguna conversión de algo  :mrgreen:


Esta rutina podría ser perfectamente:

Código: CSS
  1. /**\brief Funcion que convierte un string numerico Hexadecimal ASCII NULL-END a su valor entero de 8 bits.  
  2.    *
  3.    * \param pF Puntero al buffer que contiene el string numerico ASCII Hexadecimal de 2 digitos (00h a FFh).
  4.    *
  5.    * \return int8 Valor numerico.  
  6. */
  7. int8 hex_to_int8(char* pF){
  8.     retunt ascii_to_hex(pF[1])+(ascii_to_hex(pF[0])*16);
  9. }
Título: Re: De un String Hex a un Entero (8,16 o 32 bits)
Publicado por: Nocturno en 28 de Mayo de 2007, 02:49:47
Entendido, ahora sí que chirría menos  :D
Título: Re: De un String Hex a un Entero (8,16 o 32 bits)
Publicado por: MLO__ en 15 de Enero de 2011, 23:45:02
Hola.

Agradecimientos por la rutina ... estas en todo Don Diego. Mil gracias.

Saludos