Java:浮点数/整数的字节数

我有一个从x-plane通过UDP发送的字节数组。 字节(4)都是浮点数或整数…我试图将它们转换为浮点数但到目前为止没有运气…

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

如何将4个字节转换为int或float并且不浮动使用8个字节?

我不知道您的数据的字节顺序 。 @ dogbane的解决方案可能有效。 否则,您基本上需要根据字节的顺序将字节转换为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的位置。 虽然这是一个更大的主题,可能会更好地独立研究,但我会简要介绍一下。 或( | )是一个按位运算符,其结果是通过单独或从两个操作数中的每个位得到的位组。

例如(二进制)

  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与加法相同。

也可以看看

  • 维基百科:按位OR

您可能想要使用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)或float数组(通过asFloatBuffer()方法中的FloatBuffer )转换的奇特function类型。

使用DataInputStream ,如下所示:

  DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data)); float f = dis.readFloat(); //or if it's an int: int i = dis.readInt(); 

你不能只将它们转换为float / int。 您必须将字节转换为int或float。

这是一个简单的方法:

 byte [] data = new byte[] {1,2,3,4}; ByteBuffer b = ByteBuffer.wrap(data); System.out.println(b.getInt()); System.out.println(b.getFloat()); 

这里有一个合理的讨论:

http://www.velocityreviews.com/forums/t129791-convert-a-byte-array-to-a-float.html