Как получить байт [] из числа с плавающей запятой - PullRequest
4 голосов
/ 17 мая 2011

Как получить байт [] из числа с плавающей запятой?Мне нужно создать сообщение, где для данных у меня есть четыре байта, datum может быть беззнаковым int (легко получить byte [] из int), двоичным и float (но я не знаю, как получить четыре байта из float).Любое решение?

Ответы [ 5 ]

14 голосов
/ 17 мая 2011

Вы можете использовать Float.floatToRawIntBits(float), но я подозреваю, что вам не нужен байт [], но вместо этого вы хотите иметь возможность записи в поток байтов.В этом случае я бы использовал DataOutputStream.writeFloat(float)

Если вы используете NIO, вы можете использовать ByteBuffer.putFloat() Преимущество ByteBuffer заключается в том, что вы можете указать ByteOrder с помощью ByteBuffer.order (), чтобы вы могли обрабатывать либо Bigили Little endian.

9 голосов
/ 17 мая 2011

Класс java.lang.Float имеет методы floatToIntBits() и floatToRawIntBits(), которые можно использовать для получения битовой комбинации float (как int). Таким образом, вы могли бы сделать что-то вроде этого:

float value = 1.5e-3f;

int bits = Float.floatToIntBits(value);
byte[] bytes = new byte[4];
bytes[0] = (byte)(bits & 0xff);
bytes[1] = (byte)((bits >> 8) & 0xff);
bytes[2] = (byte)((bits >> 16) & 0xff);
bytes[3] = (byte)((bits >> 24) & 0xff);

Примечание: вам нужно выяснить для вашего конкретного приложения, какой из floatToIntBits() или floatToRawIntBits() подходит, и вам нужно будет определить, в каком порядке вам нужны байты (младший или старший порядковый номер).

3 голосов
/ 17 мая 2011

Без какой-либо математики, вы можете сделать это, записав значение через DataOutputStream и затем получить полученный результат:

ByteArrayOutputStream bos = new ByteArrayOutputStream(4);
DataOutputStream dos = new DataOutputStream(bos);
dos.writeFloat(yourFloat);
byte[] bytes = bos.toByteArray();
// at this point, your bytes will contain the 4-byte representation of the float.
1 голос
/ 17 мая 2011
 public static void main(String[] args)
            {
                float f = 23f;
                byte[] op = new byte[4];
                int fi = Float.floatToIntBits(f);
                for (int i = 0; i < 4; i++)
                    {
                        int offset = (op.length - 1 - i) * 8;
                        op[i] = (byte) ((fi >>> offset) & 0xff);
                    }
                for(byte b : op)
                    {
                        System.out.format("0x%02X ", b);
                    }
            }
1 голос
/ 17 мая 2011

Если вы думаете, что легко получить байты целого числа, Float.floatToIntBits, вероятно, то, что вы хотите:

float f = ...;
int i = Float.floatToIntBits(f);
byte[] floatBytes = toBytes(i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...