【问题标题】:using java to unpack binary php packed float使用java解包二进制php打包浮动
【发布时间】:2011-09-19 22:03:46
【问题描述】:

我使用 php 函数 pack 创建了一些二进制数据。 然后我需要从 java 应用程序中解压这些数据。我已经能够解压整数、字符串、长整数和其他数据类型,但我遇到了浮点数问题。

我使用如下代码从 php 创建数据

pack("f", 189.0);

然后在 java 中,我使用来自 DataInputStream 对象的方法 readFloat(),但我得到的值很小且不连贯。

显然 php 和 java 使用不同的符号来表示浮点数。 如何解决这个问题并执行从 php packed float 到 native java float 的转换?

【问题讨论】:

标签: java php floating-point type-conversion pack


【解决方案1】:

我能够使用以下代码解决我的问题:bytes convert to float (php)

我在 java 中创建了以下实用方法,它与 DataInputStreams 配合得很好:

protected static float readFloat(DataInputStream stream) throws IOException
{
    byte byte0 = stream.readByte();
    byte byte1 = stream.readByte();
    byte byte2 = stream.readByte();
    byte byte3 = stream.readByte();

    int i = (byte3 & 0xff) << 24 | (byte2 & 0xff) << 16 | (byte1 & 0xff) << 8 | byte0 & 0xff; 
    return Float.intBitsToFloat(i);
}

【讨论】:

    【解决方案2】:

    似乎 pack 函数不是创建标准浮点二进制表示的最佳选择,因为您既不能指定字节序,也不能保证使用什么表示。

    这可能会导致不太常见的机器或配置(甚至常见?我假设 php 也使用 IEEE 754,但 afaik 没有指定!),但最可能的问题是 java 假设很大字节序,你得到的数据是小端编码的。

    您可以自己进行转换(不是那么难,基本上是一个简单的包装器)或使用可以指定字节顺序的 nio 类(即 ByteBuffer)。

    不知道 php 是否有一些更有保证的功能(我敢肯定有一些东西),但是如果你使用一些更大的包并且可能会丢失一些准确性,你可以传输字符串 - 这样可以避免这些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多