【发布时间】:2010-11-18 11:45:03
【问题描述】:
我需要序列化一个 java Float,以供用 C++ 编写的应用程序通过 Socket 通信读取。这有标准吗?在 Float 类中使用方法 floatToIntBits 是最简单的,但我不确定这有多标准。
【问题讨论】:
标签: java c++ serialization
我需要序列化一个 java Float,以供用 C++ 编写的应用程序通过 Socket 通信读取。这有标准吗?在 Float 类中使用方法 floatToIntBits 是最简单的,但我不确定这有多标准。
【问题讨论】:
标签: java c++ serialization
事实上,这是相当标准的。 floatToIntBits 函数为您提供浮点的 IEEE 编码的实际字节。唯一的问题是字节将是大端的,因此在读入 C++ 应用程序时必须颠倒字节顺序。 (除非你的 C++ 平台也是大端的!)
【讨论】:
使用Float.floatToIntBits()(或Float.floatToRawIntBits(),如果您想保留NaN 值)将浮点数转换为整数。 floatToIntBits() 被指定以 IEEE 754 格式返回整数,这是几乎所有 C/C++ 实现所使用的格式。然后,您应该将整数转换为网络字节顺序(大端)的字节数组,然后您可以安全地将其序列化为文件、套接字、字节流等:
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);
【讨论】:
byte 只查看底部 8 位,因此移入顶部 8-24 位的值(>> 的情况下为 0,>>> 的情况下为符号位的副本) 没关系。
除非你真的需要它是二进制的,无论是出于带宽还是速度的原因,我个人只会将它转换为字符串。它避免了各种二进制兼容性问题。
【讨论】: