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

JNK*_*JNK 14 java floating-point integer casting bytearray

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

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

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

Mar*_*ers 23

我不知道您的数据的字节顺序.@ dogbane的解决方案可能有效.否则,您基本上需要根据字节的顺序将字节转换为int类型,例如:

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

然后你可以使用这个转换为浮点数:

float asFloat = Float.intBitsToFloat(asInt);
Run Code Online (Sandbox Code Playgroud)

这基本上是DataInputStream幕后的内容,但它假定您的字节按特定顺序排列.

编辑 - 按位或

OP要求澄清在这种情况下OR的位置.虽然这是一个更大的主题,可能会更好地独立研究,但我会简要介绍一下.Or(|)是一个按位运算符,其结果是通过单独或从两个操作数中的每个位得到的位组.

例如(二进制)

   10100000
|  10001100
-----------
   10101100
Run Code Online (Sandbox Code Playgroud)

当我建议在上面使用它时,它涉及将每个字节移动到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)
Run Code Online (Sandbox Code Playgroud)

当你将两个数字组合在一起并且你知道两者中没有设置两个相应的位时(这里就是这种情况),按位OR与加法相同.

也可以看看


Oph*_*ian 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();
Run Code Online (Sandbox Code Playgroud)

它还具有花俏的功能,用于(通过你的字节数组转换成int数组IntBuffer从asIntBuffer()方法)或浮动阵列(通过FloatBuffer从asFloatBuffer()方法),如果你知道输入的真正意义之一类型.

  • 好吧,当然它不能自动检测你的字节顺序,但在你告诉它(使用`ByteBuffer :: order(ByteOrder)`)使用哪个字节序(默认情况下它使用ByteOrder :: BIG_ENDIAN),其他一切都是由ByteBuffer照顾. (5认同)