Reputation: 285
I have a program that needs to take in 4 bytes and convert them to an IEEE-754 float. The bytes are transferred out of order, but I can put them back in order just fine. My problem is casting them to a float. The relevant parts of code:
//Union to store bytes and float on top of each other
typedef union {
unsigned char b[4];
float f;
} bfloat;
//Create instance of the union
bfloat Temperature;
//Add float data using transmitted bytes
MMI.Temperature.b[2] = 0xD1;//MMIResponseMsg[7];
MMI.Temperature.b[3] = 0xE1;//MMIResponseMsg[8];
MMI.Temperature.b[0] = 0x41;//MMIResponseMsg[9];
MMI.Temperature.b[1] = 0xD7;//MMIResponseMsg[10];
//Attempting to read the float value
lWhole=(long) ((float)MMI.Temperature.f);
//DEBUGGING
stevenFloat = (float)MMI.Temperature.f;
lWhole
is a long and stevenFloat
is a float. When debugging I can see that the values I assign to the byte array are being stored correctly, however the values of stevenFloat
and lWhole
are incorrect. They seem to hover close to 0, or close to the max float/long values. A long and float are both 32 bits with my compiler.
Does anyone know why this isn't working? It looked correct to me when I received the code to work on and it appears to be a common solution online, I am just stumped.
Upvotes: 8
Views: 8844
Reputation:
Indeed, this is an endianness issue:
#include <stdio.h>
#include <stdint.h>
int main()
{
union {
uint8_t bytes[4];
float f;
} fun1 = { .bytes = { 0x41, 0xd7, 0xd1, 0xe1} }, fun2 = { .bytes = { 0xe1, 0xd1, 0xd7, 0x41} };
printf("%f\n%f\n", fun1.f, fun2.f);
return 0;
}
This prints:
-483860023749617123328.000000
26.977480
Upvotes: 10