Mam program, który musi zajmować 4 bajty i konwertować je na zmienną IEEE-754. Bajty są przesyłane poza kolejnością, ale mogę je przywrócić w porządku. Mój problem polega na tym, że rzucają je w ruch. Odpowiednie części kodu:Tablica bajtów do float
//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
jest długa i stevenFloat
jest pływak. Podczas debugowania widzę, że wartości przypisane do tablicy bajtów są przechowywane poprawnie, jednak wartości stevenFloat
i lWhole
są niepoprawne. Wydaje się, że znajdują się blisko wartości 0 lub zbliżają się do maksymalnych wartości zmiennoprzecinkowych/długich. Długi i zmiennoprzecinkowy są 32 bitowe z moim kompilatorem.
Czy ktoś wie, dlaczego to nie działa? Wydaje mi się to poprawne, gdy otrzymałem kod do pracy i wydaje się, że jest to powszechne rozwiązanie w Internecie, jestem po prostu zakłopotany.
Czy na pewno są one przenoszone w porządku? Kiedy wstawiam '0x41d7d1e1' do konwertera heksadecymalnego, mam ~ 27, co wydaje mi się fajną liczbą. –
Problem endianness? –
czego można się spodziewać po '0xD1E141D7'? – triclosan