I have a system where I have to implement to second part. The issue is that I received a float where the bytes are mixed. In the example below, the input is 1E9 (f_orig) and what is receive is this 2.034699e+26 (f_recv). I did the function ABCD_to_CDAB_float but I find it ugly. Is there a better way to to write ABCD_to_CDAB_float(without two temporary variables will already be nice) ?
#include <stdio.h> #include <float.h> #include <string.h> #include <stdint.h> /* Change float byte order */ float ABCD_to_CDAB_float(float infloat) { float outfloat; uint8_t tmp[4]; memcpy(&tmp, &infloat, 4); uint8_t tmp2[] = {tmp[2], tmp[3], tmp[0], tmp[1]}; memcpy(&outfloat, &tmp2, 4); return outfloat; } int main() { float f_orig = 1E9; // This is the value sent printf("f_orig\t%e\n", f_orig); char str_orig[4]; memcpy(&str_orig, &f_orig, 4); printf("str_orig\t%x %x %x %x\n", str_orig[0], str_orig[1], str_orig[2], str_orig[3]); float f_built; // same as f_orig char str_built[] = {0x28, 0x6B, 0x6E, 0x4E}; memcpy(&f_built, &str_built, 4); printf("f_built\t%e\n", f_built); // it prints "1E9" float f_recv; // received float char str_recv[] = {0x6E, 0x4E, 0x28, 0x6B}; memcpy(&f_recv, &str_recv, 4); printf("f_recv\t%e\n", f_recv); // converesion was wrong somewhere char str6[] = {str_recv[2], str_recv[3], str_recv[0], str_recv[1]}; float f_res; memcpy(&f_res, &str6, 4); printf("f_res\t%e\n", f_res); // result is fine printf("%e\n",ABCD_to_CDAB_float(f_recv)); // result is right return 0; }
XORbut we need to know what you are looking for exactly.memcpyby casting the address of thefloattochar *. Converting float values from big endian to little endian