如何在Java中将byte[]转换为float[]并再次转换回来?

3

我通过InputStream从.wave文件中读取数据,read()函数返回的是bytes。我使用的声音处理库只接受float[]进行处理。它完成后会返回一个float[]。现在我需要再次将其以byte格式写入Android的AudioTrack。

如何将这些bytes转换为float[],然后再转换回byte[]?我搜索了一下,但似乎所有的解决方案都和我的情况不太一样,而且所有的问题都以不同的方式得到解决......所以我现在有点迷惑。

如果已经在某种库中提供了这样的转换,我很高兴听到这个消息!

谢谢!


这些浮点数的范围是多少?是从-1.0到1.0吗?找出来就可以很容易地进行转换。 - Kayaman
2
https://dev59.com/T2ox5IYBdhLWcg3wOx1i 上有答案。 - arynaq
2个回答

1
您可以使用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...我做错了什么吗? - user717572

0

你只需要复制这些位。 尝试使用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的替代方案只支持在类型相同的情况下进行复制。 - user717572

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