我必须将一系列 Java 浮点数转换为 Little Endian 才能被 C++ 程序正确读取。我正在处理大量的花车。
我尝试过 ByteBuffer、GeoSoft 和 Apache Commons I/O 实用程序。大约每 1% 的时间,一些浮点数在转换为 IntBits 时似乎被识别为 NaN 值。我什至尝试过 FLOAT.floatToRawIntBits 来解决问题,但无济于事。
作为我所说的一个例子,当问题出现时,我给出了一个具体的例子。
这是一系列正确交换的浮点数..
8.93516466e-02
-1.0571138
-2.2298267
0.042286094
0.8592236
0.5098497
0.67256117
但是,我看到了这个:
6.9055E-41
-1.0571138
-2.2298267
0.042286094
0.8592236
0.5098497
0.67256117
你能告诉我如何“吸收”这些被识别为 NaN 的位序列吗?
我正在粘贴用于促进字节交换的代码。
public static float swap (float value)
{
int intValue = Float.floatToRawIntBits (value);
intValue = swap (intValue);
return Float.intBitsToFloat (intValue);
}
public static int swap (int value)
{
int b1 = (value >> 0) & 0xff;
int b2 = (value >> 8) & 0xff;
int b3 = (value >> 16) & 0xff;
int b4 = (value >> 24) & 0xff;
return b1 << 24 | b2 << 16 | b3 << 8 | b4 << 0;
}
本例中的问题编号为 8.93516466e-02
我打印了交换前后的位,得到了这个:
111101101101101111110111111111
11111111111111011011011000111101
这是我打印出来的代码——告诉我它是否错误:
public static float testSwap (float value)
{
int intValue = Float.floatToRawIntBits (value);
System.out.println(Integer.toBinaryString(intValue));
intValue = swap (intValue);
System.out.println(Integer.toBinaryString(intValue));
return Float.intBitsToFloat (intValue);
}