Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Преобразовать byte[4] во float и наоборот


Автор: Metal_Heart 24.4.2006, 13:20
Уж простите за примитивный вопрос, есть задача: преобразовать byte[4] во float и наоборот
(Аналог union в С++)

Добавлено @ 13:31 
и ещё вопросик, что дает эта функция:

Код

 Float.intBitsToFloat(int bits)


меня смущает это: int bits 

Автор: ALKS 24.4.2006, 13:50
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Float.html#intBitsToFloat(int)
Цитата
intBitsToFloat

public static float intBitsToFloat(int bits)
Returns the float value corresponding to a given bit represention. The argument is considered to be a representation of a floating-point value according to the IEEE 754 floating-point "single format" bit layout.
...

Неужели так трудно почитать доку прежде чем вопросы задавать?  

Автор: Metal_Heart 24.4.2006, 13:53
именно оттудова я это и почерпнул, но не понял. Не переведешь? 

Автор: ALKS 24.4.2006, 14:06
Цитата(Metal_Heart @ 24.4.2006,  13:53)
именно оттудова я это и почерпнул, но не понял. Не переведешь?

нет. словари и форум переводчиков тут: http://www.multitran.ru/ 

Автор: garm 24.4.2006, 14:11
Если я правильно понял документацию, Float.intBitsToFloat() возвращает float, двоичное представление которого совпадает с двоичным представлением аргумента.
Соотвественно для преобразования byte[4] во float можно сначала преобразовать его в int, потом позвать эту функцию.
Что же касается преобразования byte[4] в int, думаю можно сделать так:
Код

DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
int i = in.readInt();

где bytes - это byte[4]. 

Автор: Metal_Heart 24.4.2006, 14:17
in.readFloat() ??? smile

Добавлено @ 14:20 
garm, + благодарю, но в что бы это всё-таки значило?
Цитата(garm @  24.4.2006,  14:11 Найти цитируемый пост)
двоичное представление которого совпадает с двоичным представлением аргумента.

 

Автор: garm 24.4.2006, 14:37
Цитата(Metal_Heart @  24.4.2006,  18:17 Найти цитируемый пост)
in.readFloat() ??? 

Действительно... Легких путей мы не ищем! smile
Цитата(Metal_Heart @  24.4.2006,  18:17 Найти цитируемый пост)
благодарю, но в что бы это всё-таки значило?

в смысле у нас int - 4 байта и float - 4 байта, просто интерпретируются они по разному.
То есть мы берём 4 байта из инта и интерпретируем их как float.
 

Автор: Metal_Heart 24.4.2006, 14:58
Обратное преобразование получается с использованием Float.floatToIntBits(float) 
(о которой только что узнал smile )
например так:
Код

int i=0, d=0;
byte[] bbyte = new byte[4];
float k=-2.123;

 i = Float.floatToIntBits(k);

 d = 0xFF000000 & i; d>>=24;
 bbyte[0]=(byte)d;
 d = 0xFF0000 & i;   d>>=16;
 bbyte[1]=(byte)d;
 d = 0xFF00 & i;     d>>=8;
 bbyte[2]=(byte)d;
 d = 0xFF & i;
 bbyte[3]=(byte)d;




но лучше, по моему, другой вариант:
Код

  float k = -2.123;

  ByteArrayOutputStream bout = new ByteArrayOutputStream();
  DataOutputStream      out  = new DataOutputStream(bout);
  try{out.writeFloat(k);out.flush();} catch(IOException e){System.err.println("exception");e.printStackTrace();}
  bbyte = bout.toByteArray();

  System.out.println("float To Bytes = 0x"+Integer.toHexString(bbyte[0]&0xFF).toUpperCase()
                                    +" 0x"+Integer.toHexString(bbyte[1]&0xFF).toUpperCase()
                                    +" 0x"+Integer.toHexString(bbyte[2]&0xFF).toUpperCase()
                                    +" 0x"+Integer.toHexString(bbyte[3]&0xFF).toUpperCase());


Добавлено @ 15:00 
П.С.
эх, исправили бы заголовок темы, а то я там такого ...   

Автор: LSD 24.4.2006, 21:54
Цитата(Metal_Heart @  24.4.2006,  15:17 Найти цитируемый пост)
но в что бы это всё-таки значило?

Это бинарное предствление float как описано в IEEE 754 floating-point "single format" bit layout. Вообщем вещь не особо нужная в обычной жизни. 

Автор: Metal_Heart 25.4.2006, 08:37
LSD, спасибо за исправления. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)