Autor Tema: Como convertir dos ascci (representando un numero en hexa) a decimal ?  (Leído 2408 veces)

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

Desconectado javier

  • PIC10
  • *
  • Mensajes: 35
Hola,
Se me presenta esta dificultad y no se si el ccs trae alguna funcion para resolver esto...
me llegan al pic grupos de dos bytes de la siguiente manera   (dos ejemplos)
66  49  ---que representan dos caracters (dos asccis)   B  1 ---en hexa B1 -- a decimal es 177
51  67---  que representan dos caracters (dos asccis)   3  C----en hexa 3C---a decimal es  60
saben del alguna funcion o alguna manera simple de pasar por ejemplo de estos dos bytes 66 - 49 al decimal 177 ?
Saludos y gracias por antemano
Javier

Desconectado joscar66

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #1 en: 17 de Diciembre de 2008, 02:19:58 »
Hola Javier,

Bueno presento la forma en que yo lo haria:

Primero declaramos una funcion que nos convierta de char a decimal:

Código: C#
  1. unsigned char2dec(char dato)
  2. {
  3.    byte tabla[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  4.    byte i;
  5.  
  6.    for(i=0;i<16;i++)  //Escaneamos la tabla para saber el equivalente
  7.    {
  8.       if(dato==tabla[i])
  9.          return i;   //Cuando lo encuentra retorna
  10.    }
  11.    return -1;
  12. }


Luego, en el programa principal se llama a la funcion de esta forma:

Código: C#
  1. void main()
  2. {
  3.    byte dig, dig1=66, dig2=49;
  4.    BYTE num1,num2;
  5.    
  6.    num1=char2dec(dig1);
  7.    num2=char2dec(dig2);
  8.    
  9.    if( (num1 != -1) && (num2 != -1)  )   //Si no hubo error en la conversion de los datos, imprimimos los valore
  10.       printf("%c %c __ %d %d __ %u",dig1,dig2,num1,num2,(num1*16)+num2);  //El valor final resulta de multiplicar el numero 1 por 16
  11.                                                                                                                      // y sumarle el segundo
  12.    while(1);
  13. }

Espero te sirva
« Última modificación: 17 de Diciembre de 2008, 20:47:44 por un Moderador »
Esfuércense por ser mejor cada día...
¡Saludos desde COLOMBIA!

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #2 en: 17 de Diciembre de 2008, 09:59:22 »
creo que se puede hacer con la funcion estandar sprintf.


Código: C#
  1. #include <stdio.h>
  2. main()
  3. {
  4. char string[10];
  5. int numero = 177;
  6.  
  7. sprintf( string, "%X", numero );//string = "B1"
  8. numero = 0;
  9. sscanf( string, "%X", &numero );//numero = 177; //Convierte la cadena "B1" al numero 177.
  10. }
« Última modificación: 17 de Diciembre de 2008, 20:48:12 por un Moderador »

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #3 en: 17 de Diciembre de 2008, 10:04:09 »
quiero decir...
creo que se puede hacer con la funcion estandar SSCANF.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #4 en: 17 de Diciembre de 2008, 11:31:00 »
Yo me he escrito un par de funciones que me van de lujo.

Código: C#
  1. /** \brief Función que convierte un carácter Hexadecimal ASCII NULL-END a su valor entero de 8 bits.
  2.   * \param d Caracter Hexadecimal a convertir.
  3.   * \return int8 Valor numérico.
  4.   */
  5. int8 ascii_to_hex(char d){
  6.  
  7.    int r=0x00;
  8.  
  9.    if(isxdigit(d)){
  10.       if(isdigit(d)){
  11.          r=d-'0';
  12.       }
  13.       if(isalpha(d)){
  14.          d=toupper(d);
  15.          r=10+(d-'A');
  16.       }
  17.    }
  18.    return(r);
  19. }
  20.  
  21. /** \brief Función que convierte un string numérico Hexadecimal ASCII NULL-END a su valor entero de 8 bits.
  22.   * \param pF Puntero al buffer que contiene el string numérico ASCII Hexadecimal de 2 digitos (00h a FFh).
  23.   * \return int8 Valor numérico.
  24.   */
  25. int8 hex_to_int8(char* pF){
  26.  
  27.    int8 i,ret;
  28.  
  29.    ret=0;
  30.    for(i=1;i!=255;i--){
  31.       ret+=ascii_to_hex(pF[i])*((15*(1-i))+1);
  32.    }
  33.    return ret;
  34. }
  35.  
  36. // Su uso sería ...
  37.  
  38. char HexValue[]="1F";
  39. int8 BinValue=0;
  40.  
  41. BinValue = hex_to_int8((Char *) HexValue);
  42.  
  43. // BinValue valdría 31
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #5 en: 17 de Diciembre de 2008, 11:39:39 »
Más fácil aún. Con tan solo la primera de esas funciones es suficiente si deseas solo dos dígitos hex.
Código: C#
  1. int  ascii2hex(char d){ // Convierte un caracter ascii a hex ---
  2.    int r=0x00;
  3.    if(isxdigit(d)){
  4.       if(isdigit(d)) r=d-'0';
  5.       if(isalpha(d)){
  6.          d=toupper(d);
  7.          r=10+(d-'A');
  8.       }
  9.    }
  10.    return(r);
  11. }
  12. // Su uso sería entonces
  13. char HexValue[]="1F";
  14. int8 BinValue=0;
  15. BnValue = (16*ascii2hex(HexValue[0]))+(ascii2hex(HexValue[1]));
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado javier

  • PIC10
  • *
  • Mensajes: 35
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #6 en: 17 de Diciembre de 2008, 20:40:15 »
muchas gracias por la colaboraciones!!! termine usando ideas de uds para escribir una rutina que tome los dos numeros ascci (representando un numeor en hexa) y me devuelva el decimal que nesecito.esta testeado y anda de 10!! espero que a alguien le sirva! error_conversion es una variable global para detectar el si hubo un error en la conversion (porque la funcion puede retornar valores de 0 -255)

Código: C#
  1. int dosasctodec(int char1,int char2)
  2. {
  3.     int tabla1[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70}; //tabla de codigos ascii --0123456789ABCDEF
  4.     int index[2]; //guardo el indice del primer caracter index[0] ,index[1]
  5.     int caract[2];
  6.     int i,j;
  7.     caract[0]=char1;
  8.     caract[1]=char2;
  9.     index[0]=25;//los cargo con 25--un valor que no prodria ser para detectar error
  10.     index[1]=25;
  11.     for(j=0;j<=1;j++)  
  12.    {
  13.  
  14.                error_conversion=false;
  15.                for(i=0;i<16;i++)  //Escaneamos la tabla para los dos caract[]
  16.                {
  17.        
  18.                
  19.                   if( caract[j]==tabla1[i])
  20.            
  21.                  {
  22.                
  23.                  index[j]=i;
  24.                  }
  25.                  
  26.                }
  27.             if (index[j] == 25) {
  28.             error_conversion=true;
  29.             return (0); }
  30.            
  31.    }
  32.    
  33.    
  34.    return (index[0]*16+index[1]); //lo paso de hexa a decimal
  35. }
« Última modificación: 17 de Diciembre de 2008, 20:50:08 por un Moderador »

Desconectado javier

  • PIC10
  • *
  • Mensajes: 35
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #7 en: 17 de Diciembre de 2008, 20:43:54 »
no se copio bien ,faltaba un corchete en tabla1...aca esta

Código: C#
  1. int dosasctodec(int char1,int char2)
  2. {
  3.     int tabla1[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70}; //tabla de codigos ascii --0123456789ABCDEF
  4.     int index[2]; //guardo el indice del primer caracter index[0] ,index[1]
  5.     int caract[2];
  6.     int i,j;
  7.     caract[0]=char1;
  8.     caract[1]=char2;
  9.     index[0]=25;//los cargo con 25--un valor que no prodria ser para detectar error
  10.     index[1]=25;
  11.     for(j=0;j<=1;j++)  
  12.    {
  13.                error_conversion=false;
  14.                for(i=0;i<16;i++)  //Escaneamos la tabla para los dos caract[]
  15.                {
  16.                   if( caract[j]==tabla1[j])
  17.                  {
  18.                     index[j]=i;
  19.                  }
  20.                }
  21.             if (index[j] == 25) {
  22.             error_conversion=true;
  23.             return (0); }
  24.    }
  25.    
  26.    return (index[0]*16+index[1]); //lo paso de hexa a decimal
  27. }
« Última modificación: 17 de Diciembre de 2008, 20:54:44 por un Moderador »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #8 en: 17 de Diciembre de 2008, 20:52:59 »
Me alegra que te haya funcionado  :mrgreen:

P.D.: He modificado todos los post que presentaban fuente en C para aplicarles el código GeSHi, así se ven mucho mas adecuadamente. Con [ code = csharp ] Código C  [ / code ] (quitando los espacios) se presenta el Código C formateado.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado joscar66

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Como convertir dos ascci (representando un numero en hexa) a decimal ?
« Respuesta #9 en: 18 de Diciembre de 2008, 01:26:47 »

Hola Javier, ¡Bien! que te hayas esforzado en realizar la funcion para tus propios requerimientos

Tienes toda la razon Redpic, el codigo se ve mucho mejor, lo tendre en cuentas en futuros post

Bye
Esfuércense por ser mejor cada día...
¡Saludos desde COLOMBIA!