如何从浮点数获取byte[]

5

如何从浮点数获取byte[]?我需要创建一个消息,在数据中有四个字节,数据可以是无符号整数(从整数获取byte[]很容易),二进制和浮点数(但我不知道如何从浮点数获取四个字节)。 有什么解决方案吗?

5个回答

15

您可以使用 Float.floatToRawIntBits(float) 方法,但我猜想您并不需要 byte[] 数组,而是希望能够将其写入字节流中。如果是这样的话,我建议您使用 DataOutputStream.writeFloat(float) 方法。

如果您正在使用 NIO,则可以使用 ByteBuffer.putFloat() 方法。ByteBuffer 的一个优点是您可以使用 ByteBuffer.order() 方法指定 ByteOrder,因此您可以处理大端序或小端序。


2
+1,这是在数据连接上编写浮点数的最佳解决方案。 - funkybro

9

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

不需要进行任何数学计算,您可以通过使用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

如果你认为获取一个 int 的字节很容易,Float.floatToIntBits 或许是你想要的:

float f = ...;
int i = Float.floatToIntBits(f);
byte[] floatBytes = toBytes(i);

1
 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);
                    }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接