Autor Tema: Conversion de Datos  (Leído 3532 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado vet2

  • PIC10
  • *
  • Mensajes: 10
Conversion de Datos
« 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.

Desconectado Vayadespiste

  • PIC12
  • **
  • Mensajes: 53
Re: Conversion de Datos
« Respuesta #1 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.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Conversion de Datos
« Respuesta #2 en: 08 de Septiembre de 2007, 09:13:50 »
Con que compilador?

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Conversion de Datos
« Respuesta #3 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.  :)
« Última modificación: 08 de Septiembre de 2007, 09:22:53 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Conversion de Datos
« Respuesta #4 en: 08 de Septiembre de 2007, 11:04:09 »
Diego, eres un maestro. Mas claro, a echarle agua!  :D

Felicitaciones.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Conversion de Datos
« Respuesta #5 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Conversion de Datos
« Respuesta #6 en: 08 de Septiembre de 2007, 13:21:06 »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado vet2

  • PIC10
  • *
  • Mensajes: 10
Re: Conversion de Datos
« Respuesta #7 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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Conversion de Datos
« Respuesta #8 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.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)