使用Java解包二进制PHP打包的浮点数

3

我使用php函数pack创建了一些二进制数据。

然后我需要从Java应用程序中解包这些数据。我已经能够解包整数、字符串、长整型和其他数据类型,但是在浮点数方面我遇到了麻烦。

我使用类似以下代码的方式从php创建数据:

pack("f", 189.0);

在Java中,我正在使用DataInputStream对象的readFloat()方法,但是我得到了小而不连贯的值。

显然,PHP和Java使用不同的符号表示浮点数。 如何解决此问题并将PHP打包浮点数转换为本地Java浮点数?


可能只是一个大端/小端问题吗? - Frank Farmer
1
f - 浮点数(机器相关的大小和表示) 参考 - 那么你想要实现什么?可能有其他方法来处理机器之间的差异。 - hakre
2个回答

3
我能够使用这段代码解决我的问题: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,但据我所知没有指定!)上导致微妙或不太微妙的错误,但最有可能的问题是java假定大端序,并且您获得的数据是小端编码的。您可以自己进行转换(并不难,基本上是一个简单的包装器),或者使用nio类(即ByteBuffer),在那里您可以指定字节顺序。我不知道php是否有一些具有更多保证的函数(我确定有什么),但如果您可以接受一些较大的包和可能失去一些精度,您可以传输字符串-这样可以避免这些问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接