I would like to convert an array of bytes, received from serial, to a float.
Let's consider this exemple. I'm sending 0.12 byte-wise from an Android application. The conversion from float to array of bytes in the Android side is handled by this function
public static byte [] float2Bytes(float value)
{
return ByteBuffer.allocate(4)./*order(ByteOrder.LITTLE_ENDIAN).*/putFloat(value).array();
}
When bytes arrive, they are stored in an array and the assembled.
hiBytew1 = bufferBytes[9];
//Serial.println(hiBytew1);
loBytew1 = bufferBytes[10];
//Serial.println(loBytew1);
hiBytew2 = bufferBytes[11];
//Serial.println(hiBytew2);
loBytew2 = bufferBytes[12];
//Serial.println(loBytew2);
float conAck = assemble(hiBytew1, loBytew1, hiBytew2,loBytew2);
How can I achieve this kind of conversion assuming that bytes are received in the correct order?
1 Answer 1
Just cast the pointer.
float conAck = *((float*)(bufferBytes + 9));
-
1This needs parentheses around "bufferBytes + 9".Edgar Bonet– Edgar Bonet2015年06月19日 19:00:11 +00:00Commented Jun 19, 2015 at 19:00
-
Right, otherwise it will advance
sizeof(float) * 9
bytes instead.Ignacio Vazquez-Abrams– Ignacio Vazquez-Abrams2015年06月19日 19:01:48 +00:00Commented Jun 19, 2015 at 19:01 -
Grazie Ignacio, so it will automatically assemble the sequence in a float variable? NiceUserK– UserK2015年06月19日 19:02:15 +00:00Commented Jun 19, 2015 at 19:02
-
2@UserK: It will tell the compiler that the bytes it will be looking at are a float.Ignacio Vazquez-Abrams– Ignacio Vazquez-Abrams2015年06月19日 19:02:39 +00:00Commented Jun 19, 2015 at 19:02
-
@userk there is no assembly. Floats are already stored as bytes in memory. You are asking android to put the 4 most meaningful bytes in the buffer. Then you are trekking arduino to consider the bytes together as a float. If you are to store the same number in memory it week have the same representation. In a nutshell, this is an O(1) operation.xyz– xyz2015年06月25日 14:58:31 +00:00Commented Jun 25, 2015 at 14:58