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

时间:2010-12-22 20:37:58

标签: java casting floating-point integer bytearray

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

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

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

5 个答案:

答案 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所涵盖的内容,但它假设您的字节按特定顺序排列。

编辑 - 按位OR或

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()的函数。