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

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

非常感谢。

【问题讨论】:

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

标签: java floating-point byte unsigned


【解决方案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

    【讨论】:

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