如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章

将 NAudio 的 float[] 转换为 byte[]

NEON 汇编代码,如何将 BYTE 转换为浮点数?

在JavaScript中如何将ArrayBuffer转换为Float64Array?

go笔记 - 字符串、数字、byte相互转换

如何将timestamp转换成string

如何将string转换成wstring C++