ByteSwapping Java Floats用于C ++程序

时间:2013-07-18 20:22:31

标签: java floating-point endianness

我必须将一系列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);
}

1 个答案:

答案 0 :(得分:2)

您无法通过交换字节将浮点数转换为另一个浮点数。您必须具有原始int值,否则某些值将会因您所见而损坏。这是因为float将规范化其值,并且并非所有位模式在Java中都有效。

我建议使用ByteBuffer以原生字节顺序读取FloatBuffer。这样你就不会破坏你的价值观。