Endianness
We were having endianness issues reading in some binary data in the
Windows version of my project at work… While we were able to use the
network byte-ordering routines ( htons(), etc) to swap the
integer values, byteswapping floats were a bit trickier… After beating my
head against the desk for a few hours yesterday, I gave up and went home…
When I got home I read the IEEE Floating Point spec (IEEE 754) until I
understood how they were represented in memory, and this morning I wrote
this code to properly do the swapping:
double fswap( float f ) {
union {
float f;
unsigned char b[4];
} u1, u2;
u1.f = f;
u2.b[0] = u1.b[3];
u2.b[1] = u1.b[2];
u2.b[2] = u1.b[1];
u2.b[3] = u1.b[0];
return u2.f;
}
When I first learned C a gojillion years ago I thought to myself “What
the hell could you possibly use a union for?” Guess I found
the answer… :)
You’d have to change it up a bit to swap a double… Here’s a stab at an implementation for doubles, although I haven’t tested it:
double dswap( double d ) {
union {
double d;
unsigned char b[8];
} u1, u2;
u1.d = d;
u2.b[0] = u1.b[7];
u2.b[1] = u1.b[6];
u2.b[2] = u1.b[5];
u2.b[3] = u1.b[4];
u2.b[4] = u1.b[3];
u2.b[5] = u1.b[2];
u2.b[6] = u1.b[1];
u2.b[7] = u1.b[0];
return u2.d;
}
Thought y’all might find it interesting, and it might be good to add to your toolchest in case you ever run into this same problem.