Java: байты в числах с плавающей точкой - PullRequest
14 голосов
/ 22 декабря 2010

У меня есть байтовый массив, отправленный по UDP из x-plane. Все байты (4) являются числами с плавающей точкой или целыми числами ... Я пытался бросить их на поплавки, но пока не повезло ...

Пример массива: байтовые данные [41] = {-66,30,73,0};

Как преобразовать 4 байта в int или float и не использовать 8 байтов?

Ответы [ 4 ]

23 голосов
/ 22 декабря 2010

Я не знаю порядковый номер ваших данных. Решение @ Dogbane может работать. В противном случае вам нужно получить байты типа int в зависимости от порядка байтов, например ::1003

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

Затем вы можете преобразовать в число с плавающей точкой, используя:

float asFloat = Float.intBitsToFloat(asInt);

Это в основном то, что DataInputStream делает под прикрытием, но предполагает, что ваши байты в определенном порядке.

Редактировать - Вкл. Битовый ИЛИ

ОП попросил разъяснить, что делает побитовое ИЛИ в этом случае. Хотя это более обширная тема, которая может быть лучше изучена независимо, я дам краткое резюме. Или (|) - побитовый оператор, результатом которого является набор битов путем индивидуального выбора каждого бита из двух операндов.

например. (в двоичном формате)

   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)

Когда вы ИЛИ два числа вместе, и вы знаете , что в обоих не заданы два соответствующих бита (как здесь), побитовое ИЛИ - это то же самое, что и сложение.

См. Также

20 голосов
/ 22 декабря 2010

Вы, вероятно, хотите использовать 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 (через IntBuffer из метода asIntBuffer ()) или массив float (через FloatBuffer из метода asFloatBuffer ()), если вы знаете, что на самом деле все входные данные одного типа.

2 голосов
/ 22 декабря 2010

Вы не можете просто разыграть их в 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

2 голосов
/ 22 декабря 2010

Используйте DataInputStream следующим образом:

    DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
    float f = dis.readFloat();

    //or if it's an int:        
    int i = dis.readInt();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...