在Java中序列化Float的最佳方法是由C++应用程序读取?

gjr*_*ber 4 c++ java serialization

我需要序列化一个java Float,由一个用C++编写的应用程序通过Socket通信读取.这有标准吗?在Float类中使用floatToIntBits方法最简单,但我不确定它是多么标准.

Dmi*_*ant 7

事实上,这是非常标准的.该floatToIntBits函数为您提供float的IEEE编码的实际字节.唯一的问题是字节将是big-endian,因此在读入C++应用程序时必须反转字节顺序.(除非你的C++平台也是big-endian!)

  • 该标准是IEEE 754 ...而且,big endian也称为"网络字节顺序",并且是通常用于线路上的二进制数据的字节序. (8认同)

Ada*_*eld 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);
Run Code Online (Sandbox Code Playgroud)