Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kondrag_X1 en 23 Agosto 2015, 22:57 pm



Título: Conversión tipos float a U_int8
Publicado por: kondrag_X1 en 23 Agosto 2015, 22:57 pm
Hola gente,

Estoy aquí porque ando un poco perdido con los tipos y los diferentes lenguajes, les comento.

tengo un numero en float(32 bits) y necesito pasarlo a u_int8. Mi idea, y creo que no voy a perder representación es el numero tipo float multiplicarlo por 1000, es decir, 25.890 float seria 25890.0 hacerle un cast a entero.

y luego esto dividirlo en en 4 bytes que se enviaría y en java recoger los 4byte y montar el número entero.

Mi pregunta es ¿Perderé representación al multiplicar x1000?

¿Hay alguna otra manera? He visto que con memcpy pero después de probarlo no lo he conseguido.





Título: Re: Conversión tipos float a U_int8
Publicado por: ivancea96 en 23 Agosto 2015, 23:02 pm
En cuanto multiplicas un float, puede perder precisión, o puede perder valores en caso de que se salga del máximo.

Pero, ¿para qué multiplicarlo?
¿Qué quieres hacer con ese float?
Si haces:
Código
  1. float fl = 4.56;
  2. char * floatBytes = &fl;

Tendrás en "floatBytes" un arreglo de 4 chars, que serán los valores del float en memoria. Luego ya si quieres, los copias o haces lo que quieras con ellos.

Pero... ¿Qué pretendes hacer?


Título: Re: Conversión tipos float a U_int8
Publicado por: kondrag_X1 en 24 Agosto 2015, 00:01 am
Hola y gracias por contestar,

mira estoy programando un microprocesador con bluetooth  y usando la librería de bluetooth ,que me permite enviar en el payload información, adjunto la info pero en tipo unsigned char *.

cosa que con tu código vendría al pelo. Gracias.

Pero cuando leo los datos con otro programa de java como los interpreto de ahí mi pregunta.

lo que había pensado era: multiplicarlo, hacerle un cast a int y enviar 4 bytes.
recojo la información en el java y formo un int con los 4 bytes divido por 1000 y tendría el valor leído.

 PD: dejo el codillo para la conversión

Código
  1. uint8_t * float2ArrayUint8(float value)
  2. {
  3.    uint8_t output[] = {0,0,0,0};
  4.    uint32_t dataValue = (uint32_t) value * 1000;
  5.  
  6.    output[0] = dataValue and 0x000F;
  7.    output[1] = dataValue and 0x00F0;
  8.    output[2] = dataValue and 0x0F00;
  9.    output[3] = dataValue and 0xF000;
  10.  
  11.    return &output;
  12. }
  13.  


Título: Re: Conversión tipos float a U_int8
Publicado por: ivancea96 en 24 Agosto 2015, 00:15 am
Lo ideal es que hagas eso para enviarlo, y luego, puedes utilizar Float.intBitsToFloat(int bits) (http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html#intBitsToFloat%28int%29)

Esa función transforma un entero de 4 bytes (la cadena de bytes), a float.
Tendrías que transformar los 4 bytes que recibes en Java a un int.
Esto último lo puedes hacer rápido con ByteBuffer:
Código
  1. ByteBuffer bb = ByteBuffer.wrap(array); // array = 4 bytes float
  2. // bb.order(ByteOrder.LITTLE_ENDIAN);
  3. int n = bb.getInt();

"Little endian" y "big endian" son las formas de las que se guarda en memoria los datos, sin ir más lejos.

La linea comentada "order()", depende de si utilizas LITTLE_ENDIAN o BIG_ENDIAN. Por ejemplo, Windows utiliza little-endian. Bueno, solo puede ser LITTLE_ENDIAN y BIG_ENDIAN, en el peor de los casos, prueba y averigua cual es xD


Título: Re: Conversión tipos float a U_int8
Publicado por: kondrag_X1 en 24 Agosto 2015, 00:17 am
muchísimas gracias por contestarme la verdad no sabia si estaba haciendo una genialidad o un disparate.
 ::)