用java解压二进制php打包浮点数

时间:2011-06-21 21:52:00

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

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

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

pack("f", 189.0);

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

我能够使用以下代码解决我的问题: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);
}