2013-10-27 7 views
5

Ich versuche, ein Byte [] in ein float [] zu konvertieren, indem Sie das Byte [] in einen ByteBuffer setzen und in einen FloatBuffer (.asFloatBuffer) konvertieren dies zu einem Array.Nicht unterstützteOperationException mit dem Konvertieren von byte [] in float []

private static float[] toFloatArray(byte[] bytes) { 
    ByteBuffer buffer = ByteBuffer.wrap(bytes); 
    return buffer.asFloatBuffer().array(); 
} 

jedoch ausgeführt wird:

byte[] bytes = {14,32,26,21}; 
      toFloatArray(bytes); 

mir Gibt einen java.lang.UnsupportedOperationException at java.nio.FloatBuffer.array(Unknown Source). Ich glaube, die Dokumentation besagt, dass der Fehler etwas damit zu tun hat, dass der Puffer nicht von einem Array (???) unterstützt wird.

Jeder hat eine Idee, wie man das repariert, oder wie ich dieses Array in Floats konvertieren soll?

+0

Ich bin versucht zu denken, dass Sie "tiefer" gehen und versuchen sollten, einen float [] zu beginnen, anstatt mit einem byte []. Abgesehen davon könnten Sie #getFloat() für den umschlossenen Puffer aufrufen, bis keine Eingaben mehr möglich sind. – Max

Antwort

6
private static float[] toFloatArray(byte[] bytes) { 
     ByteBuffer buffer = ByteBuffer.wrap(bytes); 
     FloatBuffer fb = buffer.asFloatBuffer(); 

     float[] floatArray = new float[fb.limit()]; 
     fb.get(floatArray); 


     return floatArray; 
    } 

ex:

 byte[] bytes = {65,-56,0,0 , 65,-56,0,0}; 
    float[] result = toFloatArray(bytes); 

    //print 25.0 25.0 
    System.out.println(Arrays.toString(result)); 
+0

Das funktioniert super! Die andere Antwort ist auch gut, aber ich bevorzuge diese, weil keine Schleife erforderlich ist. – user717572

1

Der einfache Weg, um eine von einer floatbyte[] Array durch einen ByteBuffer gewickelt zu erhalten, ist getFloat() zu verwenden, die die nächsten 4 Bytes liest und gibt die erzeugten float. Sie können dies in einer Schleife tun, wenn Ihr byte[] mehr als 4 Bytes enthält. Beachten Sie, dass die Methode

BufferUnderflowException wirft - Bei weniger als vier Bytes in diesem Puffer verbleibenden

Sie können es von der FloatBuffer bekommen auch

buffer.asFloatBuffer().get(); 

wenn Sie wollen aber array() löst eine UnsupportedOperationException, wenn das hb Feld der Instanzist. Wenn Sie sich den Quellcode von Oracle JDK aussehen 7 gibt es einen Kommentar

final float[] hb; // Non-null only for heap buffers 

Wenn Sie Ihren Code ausführen, werden Sie feststellen, die zurück FloatBuffer ist ein ByteBufferAsFloatBufferB, kein HeapFloatBuffer.

+0

Ich werde das morgen versuchen. Aber wenn ich es richtig verstehe, wandelt asFloatBuffer() den Typ nicht wirklich um, sondern ändert nur, wie das Byte-Array interpretiert wird. – user717572

+0

@user Scheint so. Javadoc-Status 'Erstellt eine Ansicht dieses Bytepuffers als Float-Puffer.' –

+0

Ja, deshalb verursacht es einen Fehler, wenn Sie" return ByteBuffer.wrap (bytes). AsFloatBuffer(). Array(); " weil wirklich Bytes der Speicher ist, der zugewiesen wird. Es kann nicht zulassen, dass ein Array float [] und byte [] auf denselben Speicher verweist. – Tatarize

0
public static float[] toFloatArray(byte[] bytes) { 
    float[] floats = new float[bytes.length/4]; 
    ByteBuffer.wrap(bytes).asFloatBuffer().get(floats).array(); 
    return floats; 
} 

Der Grund, warum Sie nicht return ByteBuffer.wrap(bytes).asFloatBuffer().array(); tun kann, ist, dass es eine Ansicht dieses Bytepuffer als Schwimmer Puffer erzeugt. Was bedeutet, dass es den gleichen Speicher verwendet. Es ist blitzschnell, benötigt aber einen Platz, um es in den Speicher zu legen, der nicht als float [] AND byte [] behandelt wird, weshalb er Ihnen die Daten nicht ohne neuen Speicher zurückgeben kann.

public static void convertFloatArray(byte[] bytes, float[] floats) { 
    ByteBuffer.wrap(bytes).asFloatBuffer().get(floats,0,bytes.length/4); 
} 

Es ist nur die Klasse hat keinen eigenen Speicher machen, sondern hantiert mit dem Speicher, den Sie geben, was super ist, aber manchmal verwirrend sein könnte.

Verwandte Themen