2013-10-27 33 views
5

ByteBufferにbyte []を入れ、FloatBuffer(.asFloatBuffer)に変換してからbyte []をfloat []に変換しようとしています。これを配列にします。byte []をfloat []に変換するUnsupportedOperationException

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

しかしランニング:

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

は私にjava.lang.UnsupportedOperationException at java.nio.FloatBuffer.array(Unknown Source)を与えます。 私は、このエラーには、配列(???)によってサポートされていないバッファと何か関係があると書類によると思います。

誰でもこれを解決する方法、またはこの配列を浮動小数点に変換する方法を知っていますか?

+0

私はあなたが「もっと深く」行き、バイト[]の代わりにフロート[]を開始しようとしたいと思うように誘惑されます。それを避けて、入力がなくなるまで、ラップされたバッファに対して#getFloat()を呼び出すことができます。 – Max

答えて

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; 
    } 

例:

 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

これは素晴らしい作品です!他の答えも良いですが、私はループを必要としないのでこれを好む。 – user717572

1

ByteBufferによってラップbyte[]配列からfloatを取得する簡単な方法は、次の4つのバイトを読み取り、生成floatを返すgetFloat()を使用することです。 byte[]に4バイト以上が含まれている場合は、ループでこれを実行できます。このバッファ内に残っているより少ない4バイト がある場合

あなたが

buffer.asFloatBuffer().get(); 

場合にもFloatBufferからそれを得ることができます - 方法は

BufferUnderflowExceptionをスローすることに注意してくださいあなたが欲しいが、array()は、hbフィールドがならばUnsupportedOperationExceptionをスローする。あなたはOracleのJDK 7からソースコードを見れば、コメント

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

があり、あなたがあなたのコードを実行する場合は、返さFloatBufferByteBufferAsFloatBufferB、ないHeapFloatBufferでわかります。

+0

明日これを試してみます。しかし、私が正しく理解すれば、asFloatBuffer()は実際には型を変換しませんが、バイト配列の解釈方法だけを変更しますか? – user717572

+0

@userそれのように見えます。 Javadoc states 'このバイトバッファーのビューをフロートバッファーとして作成します。' –

+0

はい、「ByteBuffer.wrap(bytes).asFloatBuffer()。array();」を返すときにエラーが発生する理由です。なぜなら、本当にバイトは割り当てられたメモリであるからです。 float []とbyte []配列が同じメモリを指し示すことはできません。 – Tatarize

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

あなたがreturn ByteBuffer.wrap(bytes).asFloatBuffer().array();を行うことができない理由は、それがfloatバッファとしてこのbyteバッファのビューを作成することです。つまり、同じメモリを使用しています。それは高速ですが、浮動小数点[]とバイト[]として扱われていないメモリに置く場所が必要です。なぜ新しいメモリなしでデータを返すことができないのですか?

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

それはただのクラスは素晴らしいです、あなたがそれを与えるメモリ、と独自のメモリが、フィドルをしないのですが、時々混乱することができます。

関連する問題