Autor Tema: De un String Hex a un Entero (8,16 o 32 bits)  (Leído 2480 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
De un String Hex a un Entero (8,16 o 32 bits)
« 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. }

« Última modificación: 28 de Mayo de 2007, 02:59:36 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: De un String Hex a un Entero (8,16 o 32 bits)
« Respuesta #1 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?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: De un String Hex a un Entero (8,16 o 32 bits)
« Respuesta #2 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:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: De un String Hex a un Entero (8,16 o 32 bits)
« Respuesta #3 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. }
« Última modificación: 28 de Mayo de 2007, 03:00:32 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: De un String Hex a un Entero (8,16 o 32 bits)
« Respuesta #4 en: 28 de Mayo de 2007, 02:49:47 »
Entendido, ahora sí que chirría menos  :D

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: De un String Hex a un Entero (8,16 o 32 bits)
« Respuesta #5 en: 15 de Enero de 2011, 23:45:02 »
Hola.

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

Saludos
El papel lo aguanta todo