我有一个从x-plane通过UDP发送的字节数组。字节(4)都是浮点数或整数...... 我试着把它们扔到花车上,但到目前为止还没有运气......
示例数组: 字节数据[41] = { - 66,30,73,0};
如何将4个字节转换为int或float并且不使用8个字节?
答案 0 :(得分:23)
我不知道您的数据的endianness。 @ 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的做法。虽然这是一个更大的主题,可能会更好地独立研究,但我会简要介绍一下。或(|
)是一个按位运算符,其结果是通过单独或从两个操作数中的每个位得到的位组。
E.g。 (二进制)
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与添加相同。
答案 1 :(得分:20)
您可能想要使用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)的奇特功能如果你知道输入真的是一种类型。
答案 2 :(得分:2)
使用DataInputStream
,如下所示:
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
float f = dis.readFloat();
//or if it's an int:
int i = dis.readInt();
答案 3 :(得分:2)
您不能将它们转换为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
答案 4 :(得分:0)
我认为ByteBuffer方法更好,您可以指定数据的包装位置(从哪个字节索引开始,此处为0)以及字节序(此处为BIG_ENDIAN)。
try {
float result = ByteBuffer.wrap(data, 0, 4).order(BIG_ENDIAN).getFloat();
} catch (IndexOutOfBoundsException exception) {
// TODO: handle exception
}
Int,Short,Long存在类似于getFloat()的函数。