Как получить float из неподписанных байтов в Java? - PullRequest
3 голосов
/ 13 октября 2011

Я связываюсь с некоторым устройством, и это устройство отправляет мне данные в виде неподписанных байтов. И мне нужно конвертировать эти байты для плавания в Java. Есть ли способ?

Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 13 октября 2011

Да.Float.intBitsToFloat принимает 32 бита в виде целого числа и преобразует его в число с плавающей точкой.

Все, что вам нужно сделать в первую очередь, - это преобразовать четыре байта в int с использованием обычного сдвига и илиоперации, соответствующие порядку ваших данных.Например,

float f = Float.intBitsToFloat(
    (barr[0] & 0xff)
    | ((barr[1] & 0xff) << 8)
    | ((barr[2] & 0xff) << 16)
    | ((barr[7] & 0xff) << 24));

Вы также можете использовать FloatBuffer в зависимости от способа получения данных.

public abstract FloatBuffer asFloatBuffer()

Создает представлениеэтот байтовый буфер в качестве плавающего буфера.

Обратите внимание, что «устройство [отправляет] мне данные как неподписанные байты» не соответствует действительности.Данные отправляют вам байты, и Java представляет их как подписанных байтов.У Java нет типа байта без знака.

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

byte : тип данных байта - 8-битная подписанная два дополнения целое число.Он имеет минимальное значение -128 и максимальное значение 127 (включительно).

0 голосов
/ 13 октября 2011
Float.intBitsToFloat(int bits);

Чтобы получить int, просто объедините байты массива в целое число

big-endian:

int myInt = (byte[0] << 24) |
((byte[1] & 0xff) << 16) |
((byte[2] & 0xff) << |
(byte[3] & 0xff);

little-endian:

int myInt = (byte[3] << 24) |
((byte[2] & 0xff) << 16) |
((byte[1] & 0xff) << |
(byte[0] & 0xff);

Вы должны были потратить 2 секунды на поиск в Google.http://www.google.com/#sclient=psy-ab&hl=en&source=hp&q=java%2C+byte+array+to+float&pbx=1&oq=java%2C+byte+array+to+float&aq=f&aqi=g1&aql=&gs_sm=e&gs_upl=679l4845l0l4941l25l18l0l0l0l0l299l3512l0.10.8l18l0&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=68fe21dd632e9a4e&biw=1024&bih=607

0 голосов
/ 13 октября 2011

Как приблизительно http://download.oracle.com/javase/1.4.2/docs/api/java/io/DataInputStream.html#readFloat()?

Хотя я обычно просто смотрю, как это реализовано, а затем делаю это сам, чтобы избежать лишних затрат.

...