1

ByteBuffer と FloatBuffer を組み合わせる良い方法はありますか? たとえば、byte[]データを取得し、それをデータに変換する必要がありfloat[]、その逆も同様です。

byte[]float[](java.lang.UnsupportedOperationException)へ:

byte[] bytes = new bytes[N];
ByteBuffer.wrap(bytes).asFloatBuffer().array();

float[]byte[](作品) :

float[] floats = new float[N];
FloatBuffer floatBuffer = FloatBuffer.wrap(floats);
ByteBuffer byteBuffer = ByteBuffer.allocate(floatBuffer.capacity() * 4);
byteBuffer.asFloatBuffer().put(floats);
byte[] bytes = byteBuffer.array();
4

2 に答える 2

1

array()は、 および のオプションの操作でByteBufferあり、バッキングが適切な型の配列の上に実際に実装されているFloatBuffer場合にのみサポートされます。Buffer

代わりにget、バッファが実際にどのように実装されているかわからない場合に、バッファの内容を配列に読み込むために使用します。

于 2012-07-08T18:46:58.717 に答える
1

Louis の回答に追加すると、Java の配列は、メモリの独立した領域でなければならないという制限があります。別の配列のオフセットを指すか、別の配列のバイトを別の型として再解釈するかに関係なく、別の配列のビューである配列を持つことはできません。

この制限を克服するために、バッファ ( ByteBufferFloatBufferなど) が作成されました。これらは、プログラマーが関数呼び出しのように見えるものを使用する必要があるにもかかわらず、配列アクセスと同じくらい高速な機械語命令にコンパイルされるという点で、配列と同等です。

最高のパフォーマンスと最小のメモリ使用量を得るには、 を使用ByteBuffer.wrap(bytes).asFloatBuffer()してから と を呼び出す必要がget()ありput()ます。

float 配列を取得するには、新しい配列を割り当て、 を使用してデータをコピーする必要がありますByteBuffer.wrap(bytes).asFloatBuffer().get(myFloatArray)

ByteBufferのarrayメソッドは、誰もが通常使用するべきものではありません。Buffer が (ファイルや未加工の非 GC メモリのようなメモリ マップされた領域を指すのではなく) 配列をラップしており、配列がバッファと同じ型でない限り、失敗します。

于 2014-12-15T19:44:05.927 に答える