使用java解压二进制php打包float

发布于 2024-11-16 16:09:16 字数 356 浏览 3 评论 0原文

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

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

pack("f", 189.0);

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

显然 php 和 java 使用不同的符号来表示浮点数。 我该如何解决这个问题并执行从 php 打包浮点到本机 java 浮点的转换?

I created some binary data using the php function pack.
Then I needed to unpack this data from a java application. I've been able of unpacking integers, strings, longs and other data types but I'm in trouble with floats.

I create the data from php using a code like the following

pack("f", 189.0);

then in java i'm using the method readFloat() from a DataInputStream object, but i get small and incoherent values.

Apparently php and java uses different notations to represent floats.
How can I solve this issue and perform a conversion from php packed float to native java float?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

少钕鈤記 2024-11-23 16:09:16

我能够使用以下代码解决我的问题:字节转换为浮点(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);
}

i was able to solve my problem using this code: bytes convert to float (php)

i created the following utility method in java and it works very well with 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);
}
任谁 2024-11-23 16:09:16

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

这可能会导致在不太常见的机器或配置上出现微妙或不太微妙的错误(甚至在常见的机器或配置上?我假设 php 也使用 IEEE 754,但据我所知,这没有指定!),但最可能的问题是 java 假定大字节序,并且您获得的数据是小端编码的。

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

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

Seems like the pack function isn't the best choice for creating standard float binary representations, since you can neither specify the endianness nor get any guarantee about what representation is used.

This can lead to subtle or less subtle bugs on less common machines or configurations (or even on common? I assume php uses IEEE 754 as well but afaik that's not specified!), but the most probable problem is that java assumes big endianness and the data you get is little endian encoded.

You can either do the transformation yourself (not that hard, basically a trivial wrapper) or use the nio classes (ie ByteBuffer) where you can specify the byteorder.

No idea if php has some function with more guarantuess (I'm sure there's something) but if you live with some larger packages and loss of maybe some accuracy you could transfer strings - that avoids those problems.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文