Hi, I need to serialize a java Float to be read by an application written in C++ over Socket comms. Is there a standard for this? It would be easiest to use the method floatToIntBits in the Float Class, however I am not sure how standard that is.
That is, in fact, pretty standard. The floatToIntBits
function gives you the actual bytes of the IEEE encoding of the float. The only problem is that the bytes will be big-endian, so you'll have to reverse the byte order when reading into your C++ application. (unless your C++ platform is also big-endian!)
Unless you really really need it to be binary, either for bandwidth or speed reasons, personally I'd just convert it to a string. It avoids all sorts of binary compatibility problems.
Use Float.floatToIntBits()
(or Float.floatToRawIntBits()
if you want to preserve NaN values) to convert the float to an integer. floatToIntBits()
is specified to return the integer in IEEE 754 format, which is the format used by virtually all C/C++ implementations. You should then convert the integer into a byte array in network byte order (big-endian), which you can then safely serialize to a file, socket, byte stream, etc.:
int floatBits = Float.floatToIntBits(myFloat);
byte floatBytes[] = new byte[4];
floatBytes[0] = (byte)(floatBits >> 24);
floatBytes[1] = (byte)(floatBits >> 16);
floatBytes[2] = (byte)(floatBits >> 8);
floatBytes[3] = (byte)(floatBits);