TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: vet2 en 08 de Septiembre de 2007, 00:02:01

Título: Conversion de Datos
Publicado por: vet2 en 08 de Septiembre de 2007, 00:02:01
Hola a todos, he estado buscando pero no he encontrado alguna forma de pasar un caracter Ascii a entero y un entero a Ascii.
¿Alguien conoce alguna función para ello? Gracias.
Título: Re: Conversion de Datos
Publicado por: Vayadespiste en 08 de Septiembre de 2007, 06:36:35
Hola vet2 yo también estoy mirando esto ahora y he podido hacerlo usando las funciones que hay en el capitulo 4 de C18 C Compiler Libreries.
Por ejemplo  yo en concreto tenía un valor como int y el resultado lo almaceno en buffer pues la usé así:
                                       
                                                 itoa (valor,buffer);

Me ha funcionado bien para pasar de int a ASCII.
Título: Re: Conversion de Datos
Publicado por: LABmouse en 08 de Septiembre de 2007, 09:13:50
Con que compilador?
Título: Re: Conversion de Datos
Publicado por: RedPic en 08 de Septiembre de 2007, 09:16:13
Bien, como decía Jack el Destripador: vayamos por partes.  :P

Un entero (corto) en C se guarda en memoria con un solo byte de ocho bits, siendo el numero cero el byte con todos los bits a ceros y el número 255 ese mismo byte pero con todos los bits a unos.

0 (decimal) = 00000000 bits

Un carácter ASCII se representa también con un solo byte de ocho bits pero organizados según una tabla (que en cierto momento de la antigüedad mas remota, a un comité de expertos norteamericanos del norte se les ocurrió, y vaya usted a saber  qué se habían fumado justo antes de entrar en su reunión  :D).

El caso es que tomaron la determinación de que al '0' (carácter) lo iban a representar mediante el número entero 48. Afortunadamente lo que se fumaron no debía de ser muy fuerte porque decidieron representar el '1' (carácter) con el número entero 49, y el '2' con el 50 ... etc. etc. etc. Por lo menos mantuvieron el orden:  :shock:

'0' (carácter) = 48 decimal = 00110000 bits
'1' (carácter) = 49 decimal = 00110001 bits
'2' (carácter) = 50 decimal = 00110010 bits
...

Esto nos lleva a que cada byte (entero) de 0 a 9 se corresponde directamente con un ASCII tomado como entero de 48 a 57.

0 (decimal) = 48 (decimal)
1 (decimal) = 49 (decimal)
2 (decimal) = 50 (decimal)
...
9 (decimal) = 57 (decimal)

Así con número enteros del 0 al 9 la conversión es directa entre ellos:

ASCII de '0' = 0 decimal + 48
ASCII de '1' = 1 decimal + 48
ASCII de '2' = 2 decimal + 48

O en C de forma directa y para todos ellos:

ASCII = Decimal + 48;

A la vicecontra, viceversa, o al revés para que me se entienda podemos ver qué decimal representa cada ASCII (entre '0' y '9') con la conversión al revés:

Decimal = ASCII - 48;

Pero como además ocurre, acontece, o sucede que en lenguaje C es exactamente igual, similar o análogo escribir 48 que '0' ya que el compilador, que es un chico muy listo, sustituye nuestro '0' por su equivalente 48 podemos escribir nuestras dos conversiones de la forma:

ASCII = Decimal + '0';
Decimal = ASCII - '0';

 :mrgreen: :D :mrgreen:

Con un dígito todo está solucionado pero y ¿qué pasa con los números enteros de dos o más dígitos?  :2]

Pues que tenemos que repetir nuestra conversión tantas veces como potencias de diez aparezcan en nuestro número a convertir.

No olvidemos que lo que estamos intentando hacer es convertir un número entero, sea lo que sea eso, en la forma en que escribimos y leemos un número entero, o sea: empezando por la derecha las unidades, seguidas de las decenas (o sea otra unidad pero multiplicada por diez), seguida de las centenas (o sea otra unidad pero multiplicada por cien) ... etc etc etc.

Y la solución no está escrita en el viento (Bob Dylan, año 1966) sino en un par de funciones en C que hagan un bucle iterando dichas potencias de diez, en un sentido, dividiendo para convertir de entero a ASCII, y multiplicando en el contrario de ASCII a entero:

255 = 2 * 100 + 5 * 10 + 5 * 1 o sea que tenemos que convertir 2,5,5 y juntarlos todos en un string ó por el contrario "255" = '2'-'0' * 100 + '5'-'0' * 10 + '5'-'0' * 1 y sumarlos todos.

Y estas dos cosas escritas en C son mas o menos como sigue:

De entero a string:
Código: C
  1. char * int8_to_str(int8 num){
  2.  
  3.      int8 temp=1;
  4.      int8 i,sign=0,cnt=0;
  5.      char c;
  6.      char s[10];
  7.  
  8.      while(temp>0) {
  9.          temp=(num/10);
  10.          s[cnt]=(num%10)+'0';
  11.          cnt++;
  12.          num=temp;
  13.      }
  14.      for(i = 0;i<(int8)(cnt/2);i++) {
  15.          c=s[i];
  16.          s[i]=s[cnt-i-1];
  17.          s[cnt-i-1]=c;
  18.      }
  19.      s[cnt]='\0';
  20.      printf("IntToStr %u (%s)\r\n",num,s);
  21.      return &s[0];
  22. }

Y de string a entero:
Código: C
  1. int8 str_to_int8(char* s){
  2.  
  3.    int8 ret=0,i,l,m=1;
  4.  
  5.    l=strlen(s)-1;
  6.    for(i=l;i<255;i--){
  7.       if(isdigit(s[i])){
  8.          ret+= m * (s[i]-'0');
  9.          m = m * 10;
  10.       } else break;
  11.    }
  12.    printf("StrToInt %s (%u)\r\n",s,ret);
  13.    return ret;
  14. }

Ahí tienes el porqué de las cosas.  8)

Nota importante: La función int8_to_str la he escrito de cabeza sin compilarla, igual hay que retocarla para que funcione correctamente, aunque mi consejo es que uses la itoa() estándar del C y te dejas de problemas y de quebraderos de cabeza innecesarios y te va a funcionar perfectamente.  :mrgreen:

P.D.: Novelas, me salen verdaderas novelas.  :)
Título: Re: Conversion de Datos
Publicado por: aitopes en 08 de Septiembre de 2007, 11:04:09
Diego, eres un maestro. Mas claro, a echarle agua!  :D

Felicitaciones.
Título: Re: Conversion de Datos
Publicado por: jfh900 en 08 de Septiembre de 2007, 13:13:28
Diego, muy bien, pero yo reduzco tu código así:

sprintf(Variable,"%04.2f",23.5);

Y obtengo mi número en ascii con decimales y todo. Supongo que ya conoceras esta función y que has creado las tuyas para ahorrar memoria. Pero es una alternativa que deben de conocer todos los no iniciados en"C".

Un saludo
Título: Re: Conversion de Datos
Publicado por: RedPic en 08 de Septiembre de 2007, 13:21:06
Si.  :mrgreen:

Mis funciones favoritas en CCS C (http://www.todopic.com.ar/foros/index.php?topic=4641.msg72809#msg72809)
Título: Re: Conversion de Datos
Publicado por: vet2 en 08 de Septiembre de 2007, 15:12:00
Hola a todos, muchas gracias por vuestras respuetas, pero creo que no me he explicado bien del todo.
Los ejemplos que comentais son para pasar string->int ó int->string, pero no estoy buscando eso.

A lo que me referia es a la Tabla Ascii que comentaba RedPic de "los americanos del norte fumaos", es decir:

Funcion Entero a Ascii:
   int i=65;
  char c='H';

  c=IntToAscii(i)
  obteniendo como resultado en c='A'

Y la Funcion Ascii a Entero:
   int i=0;
   char c='o';

   i=AsciiToInt(c);
   obteniendo como resultado en i=111

Lamento no haber sido más claro antes.

Finalmente lo he conseguido hacerlo.
Yo esto lo hago en C, usando sobrecarga de operadores c=char(i);, pero esto en CCS no funciona, me ha dado por probar eo esto:  i=c;  y ha funcionado :shock: y a la inversa tambien :shock:. Esto no lo habia probado nunca en C y creia que daria error de tipo de datos incompatibles o algo así pero se lo traga perfectamente.

P.D: RedPic piensate en escribir una novela de verdad que tus explicaciones son bastante claras y precisas. Gracias.

Gracias a todos por vuestras respuestas. Saludos.
Título: Re: Conversion de Datos
Publicado por: maunix en 10 de Septiembre de 2007, 09:09:07
Yo esto lo hago en C, usando sobrecarga de operadores c=char(i);, pero esto en CCS no funciona, me ha dado por probar eo esto:  i=c;  y ha funcionado :shock: y a la inversa tambien :shock:. Esto no lo habia probado nunca en C y creia que daria error de tipo de datos incompatibles o algo así pero se lo traga perfectamente.

En C no existe el casteo restrictivo, un dato es un char es un byte , son 8 bits... puedes usarlo como quieras.  Si haces a=65, es lo mismo que hacer a='A' 



P.D: RedPic piensate en escribir una novela de verdad que tus explicaciones son bastante claras y precisas. Gracias.
Si, varios opinamos lo mismo. Diego aca es 'El Profesor', el Sr. Didáctica y Pedagogia.