Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Convertir una cadena a representación binaria

Estas en el tema de Convertir una cadena a representación binaria en el foro de C/C++ en Foros del Web. Hola a todos, pues tengo un problema, tengo q hacer un programa que lea desde un archivo cadenas de la forma "-0.275510E+01" (esta en notación ...
  #1 (permalink)  
Antiguo 24/09/2009, 17:04
 
Fecha de Ingreso: mayo-2009
Mensajes: 16
Antigüedad: 15 años, 6 meses
Puntos: 0
(Solucionado)Convertir una cadena a representación binaria

Hola a todos, pues tengo un problema, tengo q hacer un programa que lea desde un archivo cadenas de la forma "-0.275510E+01" (esta en notación cientifica) y regrese su representacion en forma binaria, algo como : 11000000001100000101001110001110 en un flotante, para despues meter estos datos a un archivo binario para ahorrar espacio. hasta ahora tengo la parte del codigo q lee el archivo caracter por caracter, pero la parte que me interesa es pasar la cadena a la representacion binaria. ojala alguien me pueda orientar sobre este tema.

gracias

Última edición por ivdrako; 26/09/2009 a las 19:17 Razón: solucionado
  #2 (permalink)  
Antiguo 25/09/2009, 00:37
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Convertir una cadena a representación binaria

Hola,

Me imagino que estas buscando la función atof.
La representación binaria de un flotante es interna.

Cita:
... para despues meter estos datos a un archivo binario para ahorrar espacio ...
Como tu objetivo es ahorrar espacio, el almacenamiento de un float es de 4 bytes, sin importar lo que contenga; es decir, su representación interna siempre va a ser binaria (aunque no se pueda ver). Al guardar en formato binario tienes que usar fwrite y cada número va a ocupar 4 bytes exactos dentro del archivo, sin importar si es el número 1 o un millón en binario, decimal o hexadecimal, etc.

Saludos,

ps:

En el caso quede alguna duda, por supuesto que se puede hacer un algoritmo que convierta a su representación en caracteres 1 y 0. Pero estarías otra vez en el mismo lugar, puesto que un montón de caracteres con 1 y 0 van a ocupar mucho más espacio que el String inicial en notación científica o un float de 4 bytes.
  #3 (permalink)  
Antiguo 26/09/2009, 15:01
 
Fecha de Ingreso: mayo-2009
Mensajes: 16
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Convertir una cadena a representación binaria

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,

Me imagino que estas buscando la función atof.
La representación binaria de un flotante es interna.



Como tu objetivo es ahorrar espacio, el almacenamiento de un float es de 4 bytes, sin importar lo que contenga; es decir, su representación interna siempre va a ser binaria (aunque no se pueda ver). Al guardar en formato binario tienes que usar fwrite y cada número va a ocupar 4 bytes exactos dentro del archivo, sin importar si es el número 1 o un millón en binario, decimal o hexadecimal, etc.

Saludos,

ps:

En el caso quede alguna duda, por supuesto que se puede hacer un algoritmo que convierta a su representación en caracteres 1 y 0. Pero estarías otra vez en el mismo lugar, puesto que un montón de caracteres con 1 y 0 van a ocupar mucho más espacio que el String inicial en notación científica o un float de 4 bytes.
gracias por la respuesta, pero aun me queda una duda, el caso es que mi cadena esta en notacion cientifica -0.354120E-06 y la funcion atom solo convertiria la cadena -0.354120 a flotante no?? entonces si tendria que hacer una funcion q regrese la representacion de todo el numero?? o tambien acepta el caso de notacion cientifica?

y si, tienes razon en lo de convertirlo uno por uno, esa fue mi primer opcion pero no redujo en casi nada el espacio.
  #4 (permalink)  
Antiguo 26/09/2009, 15:56
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Convertir una cadena a representación binaria

Use esta función:

Código c:
Ver original
  1. #include <string.h>
  2. #include <math.h>
  3.  
  4. float atof_notacion_cientifica(char *cnumero){
  5.    char *cnum;  
  6.    char token[3] = "eE";
  7.    char *ptr;
  8.    float fnum;
  9.    int potencia;
  10.    
  11.    strcpy(cnum,cnumero);
  12.    ptr = strtok(cnum,token);
  13.    fnum = atof(ptr);
  14.    ptr = strtok(NULL,token);
  15.    potencia = atoi(ptr);
  16.    fnum *= pow(10,potencia);
  17.    return fnum;
  18. }

En esa función lo que hice fue partir la cadena en 2 según el token "E" o "e", luego se pasa cada una de estas cadenas a número y se calcula el float.

Espero le sirva.
Saludos.
  #5 (permalink)  
Antiguo 26/09/2009, 16:52
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Convertir una cadena a representación binaria

Hola,

Por ejemplo:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char** argv) {
  5.  
  6.     FILE *stream;
  7.  
  8.     float d = atof("-0.275510E+01");
  9.  
  10.     stream = fopen("data.bin", "w");
  11.     fwrite(&d, sizeof(float), 1, stream);
  12.     fclose(stream);
  13.  
  14.     d = 0;
  15.  
  16.     stream = fopen("data.bin", "r");
  17.     fread(&d, sizeof(float), 1, stream);
  18.     fclose(stream);
  19.  
  20.     printf("%f", d);
  21.  
  22.     return (0);
  23. }

En este caso, se convierte la cadena de caracteres en un float con la función atof, seguidamente lo almacenas en un archivo denominado 'data.bin', y seguidamente se vuelve a leer y se muestra en pantalla, se puede observar que el valor sigue siendo el mismo (posiblemente con una representación diferente -2.755100, pero el valor es exactamente el mismo --- con su respectivo error de precisión de todos los numeros 'flotantes' o 'dobles').

Si revisas el tamaño del archivo 'data.bin' (con 'dir' o 'ls', según el sistema operativo que estés usando --- desde el Explorador de Windows NO porque dice 1 o 4 Kb por otros motivos del NTFS), puedes observar que tiene de tamaño exactamente 4 bytes, porque cualquier float usa 4 bytes, en memoria y en disco.

Realmente no sé como explicar que un float es 'binario' interna y automáticamente, son 32 bits, usa 1 bit para el signo, 8 para la mantisa y veinte y tantos para el numero, http://en.wikipedia.org/wiki/Single_precision .

No podemos ver que está guardado en binario, porque no tiene sentido para el ser humano, por eso solo podemos verlo en decimal o hexadecimal, (o haciendo un algoritmo que lo muestre en binario), está de mas decir que si ves el archivo internamente con un editor hexadecimal o el Block de Notas o GEdit, no vas a ver el número sino 'caracteres extraños' que se forman al intentar representar datos binarios en la tabla ASCII.

Saludos,

Última edición por HackmanC; 26/09/2009 a las 17:10 Razón: agregar precisión
  #6 (permalink)  
Antiguo 26/09/2009, 17:28
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Convertir una cadena a representación binaria

Hola,

Resumiendo ... creo que me extendí demasiado.

Tienes un número en notación científica (-0.275510E+01), la única forma de representar ese número y que ocupe poco espacio es guardándolo en un float (cada float ocupa 4 bytes).

El número anterior si lo guardas como 'letras' o char, ocupa 13 bytes, porque cada letra (cada dígito es una letra según la tabla ASCII) ocupa 1 byte en la tabla ASCII.

En su 'representación humana' de binario, es decir 0101001... son 32 bytes, porque cada 1 o 0 es un char y ocupa 1 byte.

En resúmen, la mejor forma es usar atof y guardar floats con fwrite.
Pero esa es solamente mi opinión,

Saludos,
  #7 (permalink)  
Antiguo 26/09/2009, 17:38
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Convertir una cadena a representación binaria

HackmanC tiene razón, yo me equivoqué, la función atof sí lee en notación científica.
  #8 (permalink)  
Antiguo 26/09/2009, 17:40
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Convertir una cadena a representación binaria

Hola,

Oooops ... en vista de que yo no leí bien y solo querías saber si acepta o no notación científica ...
Sí .. la función atof te 'debería' aceptar cualquier caracter 'eEdD' para indicar notación científica.

Saludos,
  #9 (permalink)  
Antiguo 26/09/2009, 18:11
 
Fecha de Ingreso: mayo-2009
Mensajes: 16
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Convertir una cadena a representación binaria

Hola, gracias a los dos por su ayuda, despues de leer el primer mensaje me puse a checar lo de la notacion cientifica como dicen si la acepta, otra de las cosas que noté es que al mandar a imprimir el numero en la pantalla lo corta, por ejemplo si pongo la cadena "0.207597E-05" al utilizr atof y mandarlo a imprimir solo me aparece 0.000002, es decir corta el numero y si pongo "0.287597E-05" cuando lo imprimo en pantalla aparece 0.000003 esto spongo es por el redondeo que se hace cuando usamos los numeros flotantes, pero lei que los float pueden guardar numeros desde 1.18e-38 hasta 3.40e38 sin embargo no parece q funcione asi, alguien sabra si es por la funcion atof o simplemente por la manera que se manda a imprimir??
  #10 (permalink)  
Antiguo 26/09/2009, 18:55
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Convertir una cadena a representación binaria

Hola ivdrako,

La precisión de los números float en C es de 7 dígitos. Y su rango es de +/–3.4E38; es decir que sí está allí el número pero depende como lo visualicemos, con que funciones y como lo interpretan.

Si estas usando el formato que escribí en el ejemplo para la función printf(), %f es para representar en 'decimal con punto flotante'. Mientras que %e es para representar en formato científico.

Saludos,
  #11 (permalink)  
Antiguo 26/09/2009, 19:15
 
Fecha de Ingreso: mayo-2009
Mensajes: 16
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Convertir una cadena a representación binaria

Cita:
Iniciado por HackmanC Ver Mensaje
%f es para representar en 'decimal con punto flotante'. Mientras que %e es para representar en formato científico.

Saludos,
oye gracias por la info, no conocia el formato %e, solo el %f y con ese lo estaba ocupando, ya con esto queda resuelto mi problema. De nuevo gracias por la ayuda
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:32.