如何将 byte[] 转换为 float[] 并返回 Java?
Posted
技术标签:
【中文标题】如何将 byte[] 转换为 float[] 并返回 Java?【英文标题】:How to convert byte[] to float[] and back in Java? 【发布时间】:2013-10-19 12:52:04 【问题描述】:我正在通过 InputStream 从 .wav 文件中读取数据,并且 read() 返回字节。我使用的一个声音处理库,只接受 float[] 来处理。完成后,它给了我一个 float[] 回来。现在我需要再次以字节格式写入 android 的 AudioTrack。
如何将这些bytes
转换为floats[]
,然后再转换回byte[]
?我搜索了一下,但一切似乎与我的情况有点不同,所有问题似乎都以不同的方式解决......所以我现在有点迷路了。
如果某种库中已经提供了类似的转换,我也很高兴听到这个消息!
谢谢!
【问题讨论】:
这些浮动的范围是多少?是 -1.0 到 1.0 吗?找出这一点,您就可以轻松进行转换。 ***.com/questions/9346746/… 有答案 【参考方案1】:您只需要复制这些位。 尝试使用 BlockCopy。
float[] fArray = new float[] 1.0f, ..... ;
byte[] bArray= new byte[fArray.Length*4];
Buffer.BlockCopy(fArray,0,bArray,0,bArray.Length);
*4 是因为每个浮点数是 4 个字节。
【讨论】:
这个在 C 中工作,但 Java 替代方案只支持类型相同的复制。【参考方案2】:您可以使用java.nio.ByteBuffer。它有很多有用的方法可以从字节数组中提取不同的类型,并且还可以处理您的大部分问题。
byte[] data = new byte[36];
ByteBuffer buffer = ByteBuffer.wrap(data);
float second = buffer.getFloat(); //This helps to
float x = 0;
buffer.putFloat(x);
【讨论】:
我试过了,byte[] bytes = 32,-32,60,120; ByteBuffer bbuf = ByteBuffer.wrap(bytes); while(bbuf.remaining()>0) System.out.println(bbuf.getFloat());
但它只返回这个:3.798709E-19...我做错了吗?以上是关于如何将 byte[] 转换为 float[] 并返回 Java?的主要内容,如果未能解决你的问题,请参考以下文章