我想将byte []转换为float,但前4个数字是正确的

时间:2015-08-11 01:09:30

标签: java byte converter

所以我保存了一个音频文件。我必须将float[]转换为byte[]。这很好用:

 final byte[] byteBuffer = new byte[buffer.length * 2];
        int bufferIndex = 0;
        for (int i = 0; i < byteBuffer.length; i++) {
            final int x = (int) (buffer[bufferIndex++] * 32767.0);
            byteBuffer[i] = (byte) x;
            i++;
            byteBuffer[i] = (byte) (x >>> 8);
            if (bufferIndex < 5) {
                System.out.println(buffer[bufferIndex]);
                System.out.println(byteBuffer[i - 1]);
                System.out.println(byteBuffer[i]);
            }

        }

但是当我想读取字节并将其转换回浮点数时,前4个数字与旧数字匹配:

for (int i =0; i < length; i++) {

            i++;
            float val = (((audioB[i]) & 0xff) << 8) | ((audioB[i-1]) & 0xff);
            val = (float) (val /32767.0);
            if (bufferindex < 5) {
                System.out.println(val);
                System.out.println(audioB[i-1]);
                System.out.println(audioB[i]);
            }
            bufferindex++;
        }

输出:

0.07973075
0
0
0.149165
52
10
0.19944257
23
19
0.22437502
-121
25

---------

0.0
0
0
0.07971435
52
10
0.14914395
23
19
0.19943845
-121
25
0.22437209

为什么?

2 个答案:

答案 0 :(得分:2)

为什么不使用java.nio.ByteBuffer类?

,而不是实现自己的位变换魔法
byte[] bytes = ByteBuffer.allocate(8).putFloat(1.0F).putFloat(2.0F).array();

ByteBuffer bb = ByteBuffer.wrap(bytes);
float f1 = bb.getFloat();
float f2 = bb.getFloat();

答案 1 :(得分:1)

每个样本只需2字节填充4字节浮点数据。这显然会失去一些精确性。提示:在第一个循环中进行向后计算(2字节 - >浮动)并将结果与​​原始值进行比较,并查看x等中间值。