byte []和float []之间的转换结果错误

时间:2014-09-26 18:49:09

标签: java android

1。字节声明混淆

我已使用Android中的AudioRecord类成功读取麦克风中的原始数据。在我的代码中,原始数据保存为:byte data[] = new byte[bufferSize];

此处bufferSize是一个常数(我猜)7680。我的第一个问题是:

之间有什么区别

byte data[] = new byte[bufferSize];byte[] data = new byte[bufferSize];?在这两种情况下,我的代码似乎没有什么不同。

2。要浮动的字节

我的下一步是使用原始数据进行一些计算。为了更好的精度,我想将字节类型data转换为float。这是代码:

private void writeAudioDataToFile() {
    byte data[] = new byte[bufferSize];
    String filename = getTempFilename();
    FileOutputStream os = null;

    try {
        os = new FileOutputStream(filename);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    int read = 0;

    if(null != os) {
        while(isRecording) {
            // First print: raw data from microphone
            Log.v("print1", "data");
            read = recorder.read(data, 0, bufferSize);
            System.out.println(Arrays.toString(data)); 

            // Second print: byte[] to float[]
            Log.v("print2", "buff");
            float[] inBufferMain = new float[bufferSize];
            for (int i = 0; i < bufferSize; i++) {
                inBufferMain[i] = (float) data[i];
            }   
            System.out.println(Arrays.toString(inBufferMain)); 

            // Calculating inBufferMain here
            // ...

            // Third print: float[] to byte[]
            Log.v("print3", "data");
            for (int i = 0; i < bufferSize; i++) {
                data[i] = (byte) inBufferMain[i];
            }
            System.out.println(Arrays.toString(data)); 

            if(AudioRecord.ERROR_INVALID_OPERATION != read) {
                try {
                    os.write(data);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上面的代码中,从麦克风中读取data后,我将其打印在logcat中。结果大约为1000整数。 为什么1000?因为缓冲区全部读取7680位并保存为字节,即7680 / 8 ≈ 1000如果我的分析错误,请纠正我。但是在字节到浮点转换之后,结果只有600个浮点数。 float数组中的前600个值与字节数组中的值相同,但缺少剩余的数字。我的打印方法有什么问题吗?

3。浮点数字节

假设我已经处理了浮点数组,现在是浮点到字节转换的时候了。但第三次印刷的结果都是0。如何将float []转换为byte []?

由于

2 个答案:

答案 0 :(得分:1)

System.out.println(Arrays.toString(data));

将精确打印data.length个字节,即bufferSize

logcat条目的大小是有限的,但是4076个字符。在加入", "和字节的字符串表示的大小之间,1000是一个很好的估计。

漂浮物也是如此,除了它们通常更大以便印刷。

结论是您所看到的只是logcat有效负载的限制。见What is the size limit for Logcat and how to change its capacity?

答案 1 :(得分:1)

关于你的问题编号3.你可以利用ByteBuffer从float []转换为byte []。阅读Oracle文档:ByteBuffer.java

这个类有像putFloat()这样的实用程序方法和许多其他方法,进行这些类型的转换变得微不足道了:)