如何在Java中将浮点数转换为4个字节?

12

我无法将像这样的东西转换:

byte[] b = new byte[] { 12, 24, 19, 17};

变成像这样:

float myfloatvalue = ?;

请问能否给我一个例子?

另外,如何将这个浮点数转换回字节?


这些字节是浮点表示的位,还是4字节整数? - Bohemian
它们的顺序是什么?12位是最高有效位还是最低有效位? - Patricia Shanahan
它们只是我随意输入的随机字节值。 - user1395152
可能是Java:Bytes to floats / ints的重复问题。 - Brian Roach
精确值并不重要。这些字节表示什么?用语言描述,这些字节如何表示浮点数? - Code-Apprentice
3个回答

38

byte[] -> float

使用ByteBuffer

byte[] b = new byte[]{12, 24, 19, 17};
float f =  ByteBuffer.wrap(b).getFloat();

float -> byte[]

反向操作(已知上述结果):

float f =  1.1715392E-31f;
byte[] b = ByteBuffer.allocate(4).putFloat(f).array();  //[12, 24, 19, 17]

那很有帮助,那么将该浮点数转换回字节呢? - user1395152
3
+1 说实话,ByteBuffer 是一个被低估和未被充分利用的类。 - Bohemian
@user1395152:请阅读ByteBuffer的文档,并查看我的更新。 - Tomasz Nurkiewicz
8
+1 你可能还需要使用.order(ByteBuffer.LITTLE_ENDIAN)来设置字节顺序。 - Peter Lawrey
这对我帮助很大。需要时非常方便。美妙的是,它甚至可以与Google的protobuf的ByteBuffer一起使用。非常感谢! - Atul
这应该是:ByteBuffer.wrap(myBytes).order(ByteOrder.LITTLE_ENDIAN).getFloat(); - dotrinh PM

18

byte[] 转换为 float,可以这样做:

byte[] b = new byte[] { 12, 24, 19, 17};
float myfloatvalue = ByteBuffer.wrap(b).getFloat();

这里有一种将 float 转换为 byte[] 的替代方法,而不使用 ByteBuffer.allocate

int bits = Float.floatToIntBits(myFloat);
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);

3
小问题,ByeBuffer 编码为大端序,而当前示例使用小端序。使它们匹配起来会很好!谢谢! - Sam

2

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