我需要序列化一个java Float,以便通过Socket通信用C ++编写的应用程序读取。这有标准吗?在Float类中使用floatToIntBits方法最简单,但我不确定它是多么标准。
答案 0 :(得分:7)
floatToIntBits
函数为您提供浮点数的IEEE编码的实际字节数。唯一的问题是字节将是big-endian,因此在读入C ++应用程序时必须反转字节顺序。 (除非你的C ++平台也是big-endian!)
答案 1 :(得分:6)
使用Float.floatToIntBits()
(或Float.floatToRawIntBits()
如果要保留NaN值)将float转换为整数。指定floatToIntBits()
以IEEE 754格式返回整数,这是几乎所有C / C ++实现使用的格式。然后,您应该以网络字节顺序(big-endian)将整数转换为字节数组,然后可以安全地序列化为文件,套接字,字节流等:
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);
答案 2 :(得分:0)
除非你真的需要它是二进制的,无论是出于带宽还是速度的原因,我个人只是将它转换为字符串。它避免了各种二进制兼容性问题。