2013-10-27 8 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)를 제공합니다. 나는 그 오류가 배열 (???)에 의해 뒷받침되지 않는 버퍼와 관련이 있다고 말한다고 믿는다.

누구나이 문제를 해결하는 방법을 알고 있습니까? 아니면이 배열을 어떻게 float으로 변환해야합니까?

+0

나는 당신이 "더 깊게"가고, float []가 바이트 [] 대신에 시작해야한다고 생각하고 싶다. 그 부분을 제외하면 입력이 부족할 때까지 래핑 된 버퍼에서 #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을를 throw합니다 원하는 경우 array()hb 필드가인 경우 UnsupportedOperationException을 던집니다.. 오라클 JDK 7에서 소스 코드를 보면, 당신은 당신의 코드를 실행하면, 당신은 반환 FloatBufferByteBufferAsFloatBufferB 아닌 HeapFloatBuffer입니다 알 코멘트를

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

이있다.

+0

나는 이것을 내일 시도 할 것이다. 하지만 그것을 올바르게 이해한다면, asFloatBuffer()는 실제로 타입을 변환하지 않지만 바이트 배열이 해석되는 방식 만 변경합니까? – user717572

+0

@user 이렇게 보입니다. Javadoc states'이 byte 버퍼의 뷰를 float 버퍼로서 생성합니다.' –

+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 버퍼의 뷰를 작성한다는 것입니다. 즉, 동일한 메모리를 사용한다는 의미입니다. 그것은 번개가 빠르지 만, float [] 및 byte []로 취급되지 않는 메모리에 넣을 장소가 필요합니다. 따라서 새로운 메모리없이 데이터를 다시 돌려 줄 수는 없습니다.

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

그냥 클래스가 자체 메모리가되지 않습니다이다하지만 끝내 당신이 그것을주는 메모리와 놀아 날,하지만 시간에 혼동 될 수있다.

관련 문제