Java:字节到浮点数/整数

我有一个字节数组通过UDP从x平面发送。字节(4)都是浮点数或整数...我试图把它们扔到花车上,但到目前为止没有运气......

示例数组:字节数据[41] = {-66,30,73,0};

如何将 4 个字节转换为 int 或 float,而不使用 8 个字节的浮点型?


答案 1

注意:我建议在下面@Ophidian的ByteBuffer方法,它比这更干净。但是,这个答案有助于理解正在进行的位算术。

我不知道你的数据的字节序。您基本上需要根据字节的顺序将字节转换为int类型,例如:

int asInt = (bytes[0] & 0xFF) 
            | ((bytes[1] & 0xFF) << 8) 
            | ((bytes[2] & 0xFF) << 16) 
            | ((bytes[3] & 0xFF) << 24);

然后,您可以使用以下命令转换为浮点数:

float asFloat = Float.intBitsToFloat(asInt);

这基本上是在幕后所做的事情,但它假设你的字节是按一定的顺序排列的。DataInputStream

编辑 - 按位或

OP要求澄清在这种情况下按位OR的作用。虽然这是一个更大的主题,可以更好地独立研究,但我会快速简要介绍一下。Or () 是一个按位运算符,其结果是通过从两个操作数单独或对每个位进行单独或组合来设置位。|

例如(二进制)

   10100000
|  10001100
-----------
   10101100

当我建议在上面使用它时,它涉及将每个字节移动到int中的唯一位置。因此,如果你有字节,二进制是,你有这个:{0x01, 0x02, 0x03, 0x04}{00000001, 00000010, 00000011, 00000100}

                                  0000 0001   (1)
                        0000 0010             (2 <<  8)
              0000 0011                       (3 << 16)
  | 0000 0100                                 (4 << 24)
  --------------------------------------------------------
    0000 0100 0000 0011 0000 0010 0000 0001   (67 305 985)

当您将两个数字或两个数字放在一起并且您知道在两个数字中都没有设置两个相应的位(就像这里的情况一样),按位OR与加法相同。

另请参见


答案 2

你可能想使用java.nio.ByteBuffer。它有很多方便的方法可以从字节数组中提取不同类型的类型,并且还应该为您处理大多数字节序问题(包括在必要时切换字节顺序)。

byte[] data = new byte[36]; 
//... populate byte array...

ByteBuffer buffer = ByteBuffer.wrap(data);

int first = buffer.getInt();
float second = buffer.getFloat();

它还具有将字节数组转换为int数组(通过asIntBuffer()方法的IntBuffer)或浮点数组(通过asFloatBuffer()方法的FloatBuffer)的奇妙功能,如果您知道输入实际上是一种类型的。