如何从 Java 中的无符号字节中获取浮点数?

Posted

技术标签:

【中文标题】如何从 Java 中的无符号字节中获取浮点数?【英文标题】:How to get float from unsigned bytes in Java? 【发布时间】:2011-12-07 04:35:54 【问题描述】:

我正在与某个设备通信,该设备将数据作为无符号字节发送给我。我需要将这些字节转换为 Java 中的浮点数。有什么办法吗?

非常感谢。

【问题讨论】:

这里的每个答案都有严重的缺陷,恕我直言,因为每个人都在猜测输入是一种或另一种格式。所知道的只是它是“无符号字节”。 Datos,如果您想要一个好的答案,您将不得不更明确地了解输入格式。例如,我可能是个白痴,并假设您的意思是输入是(数学上)0-255 范围内的整数。但是那你为什么要把它转换成浮点数呢?等等……可能的猜测是无穷无尽的。最好是一些例子:显示输入字节和表示的数值。 更令人不安的是,一个明显错误的答案“浮点数为 8 字节”“移动 4 的倍数而不是 8 位”已被投票为正确答案。 @Ed Staub,您可以提出极端案例并强迫自己误解几乎任何事情,但是当普通人遇到不完全详细的问题时,他们会假设最普​​遍/最简单的解决方案。 投票结束,因为这个问题具有误导性,而答案更是如此。 @LastCoder - 我将其作为一个极端案例进行展示 - 我认为“我可能是个白痴”让任何人都明白这一点......关键是数据可能来自任何任何形式的硬件——通常没有像 IEEE-754 这样的远程硬件。他希望它在内部表示为浮点数这一事实并没有说明线路上的格式。 【参考方案1】:

是的。 Float.intBitsToFloat 将 32 位作为 int 并将其转换为 float。

您首先需要做的就是使用适合数据字节顺序的正常移位和/或操作将四个字节转换为int。例如,

float f = Float.intBitsToFloat(
    (barr[0] & 0xff)
    | ((barr[1] & 0xff) << 8)
    | ((barr[2] & 0xff) << 16)
    | ((barr[7] & 0xff) << 24));

您也可以使用FloatBuffer,具体取决于您接收数据的方式。

public abstract FloatBuffer asFloatBuffer()

将此字节缓冲区的视图创建为浮点缓冲区。

请注意,“设备 [正在] 以无符号字节的形式向我发送数据”是不正确的。数据正在向您发送字节,Java 将它们表示为 signed 字节。 Java 没有无符号字节类型。

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

字节:字节数据类型是一个8位有符号二进制补码整数。最小值为-128,最大值为127(含)。

【讨论】:

你想要 8 的倍数而不是 4。请更正你的 另请注意,浮点数通常表示“4”字节而不是“8”。 “8”字节将被视为双倍。浮点数=32 位=4 字节。双精度=64bits=8bytes。 @LastCoder,感谢您指出这一点。在乱搞十六进制数字后,我刚刚放了个屁。【参考方案2】:

http://download.oracle.com/javase/1.4.2/docs/api/java/io/DataInputStream.html#readFloat() 怎么样?

虽然我通常只是查找它是如何实现的,然后自己做以避免任何开销。

【讨论】:

【参考方案3】:
Float.intBitsToFloat(int bits);

要获得 int,您只需将数组的字节连接成一个整数

大端:

int myInt = (byte[0] << 24) |
((byte[1] & 0xff) << 16) |
((byte[2] & 0xff) << |
(byte[3] & 0xff);

小端:

int myInt = (byte[3] << 24) |
((byte[2] & 0xff) << 16) |
((byte[1] & 0xff) << |
(byte[0] & 0xff);

您应该花 2 秒时间来搜索 google。 https://www.google.com/?q=java+byte+array+to+float

【讨论】:

以上是关于如何从 Java 中的无符号字节中获取浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

5 dex文件

《计算机组成原理》:机器数的表示方法,定点数和浮点数

如何在java中将4字节数组转换为浮点数

如何将字节数据从套接字写入 C 中的无符号字符向量? [关闭]

JVM | Java程序如何执行

浮点数在c中的基数排序