java - 用于 C++ 程序的 ByteSwapping Java float

标签 java floating-point endianness

我必须将一系列 Java float 转换为 Little Endian,以便 C++ 程序能够正确读取。我正在处理大量的 float 。

我尝试过 ByteBuffer、GeoSoft 和 Apache Commons I/O 实用程序。大约每隔 1% 的时间,一些 float 在转换为 IntBits 时似乎会被识别为 NaN 值。我什至尝试过 FLOAT.floatToRawIntBits 来解决该问题,但无济于事。

作为我正在讨论的示例,我给出了问题出现时的具体实例。

这里是一系列正确交换的 float ..

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);
}

最佳答案

您无法通过交换字节将一个 float 转换为另一个 float 。您必须拥有原始的 int 值,否则某些值将被损坏,如您所见。这是因为 float 会标准化其值,并且并非所有位模式在 Java 中都有效。

我建议按照 native 字节顺序使用 ByteBuffer for FloatBuffer 进行阅读。这样你就不会破坏你的值(value)观。

关于java - 用于 C++ 程序的 ByteSwapping Java float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17733166/

相关文章:

java - Loader<String> onCreateLoader 不返回 String

java - 如何让 Play 在与现有对象合并时创建新的 ID(自动增量)

floating-point - atof 的奇怪行为

python - 为什么对数字调用 float() 比在 Python 中添加 0.0 慢?

Javascript 类型化数组和字节顺序

java - C 和 Python 代码到 Java 的帮助

java - Jsoup,解析html表

java - Jms 依赖关系未解决?

java - 如果 double 类型可以处理数字 4.35 和 435,为什么 4.35 * 100 的计算结果为 434.99999999999994?

arm - 如何确定处理器运行的字节序模式?