I’ve seen a few posts & threads around the Internet about network order (aka big-endian) and floating point values in C#. First – all binary values are affected by the underlying architecture – this includes floating point values. It’s akin to Hebrew – all the words are written right-to-left, not just some. Now that we’ve cleared that up, I’m sure you’re wondering just how we reverse the ‘endianness’ of floats given that IPAddress only lets you convert ints.
A 32bit int is merely 32 bits of data. We just label it as an ‘int’ and always interpret it thus. What we need to do, is take a 32bit float and pretend it’s an int, get C# to convert it, then send it down the network pipe. The receiver can then fix the endianness and read it as a float. I’ve written some code that does just that:
/// <summary> /// Convert a float to network order /// </summary> /// <param name="host">Float to convert</param> /// <returns>Float in network order</returns> public static byte[] HostToNetworkOrder(float host) { byte[] bytes = BitConverter.GetBytes(host); if (BitConverter.IsLittleEndian) Array.Reverse(bytes); return bytes; } /// <summary> /// Convert a float to host order /// </summary> /// <param name="network">Float to convert</param> /// <returns>Float in host order</returns> public static float NetworkToHostOrder(int network) { byte[] bytes = BitConverter.GetBytes(network); if (BitConverter.IsLittleEndian) Array.Reverse(bytes); return BitConverter.ToSingle(bytes, 0); }
Remember Network Order is always big-endian. .NET itself can be big-endian or little-endian depending on the underlying architecture. For this reason we always check if we even need to perform a conversion by checking if we’re running on a little-endian system. As an aside Java is always big-endian, regardless of the underlying architecture it’s running on.