2012-01-18 1 views
1

ByteBuffer byteBuffer는 TCP/IP 연결을 통해 수신되며 NetBeans 에뮬레이터에 표시되며이 중단 시간 동안 바이트 4, 5, 6 및 7에 0x2b, 0x69, 0x80 및 0x3f를 포함합니다. endianess가 틀린 경우 잘못된 float 값 또는 숫자 형식 예외가 예상되지만 항상 4 바이트의 다양한 집합에 대해 0.0이 아닌 것으로 예상됩니다. 이 ByteBuffer, 인덱스 8, 12 등에서 읽은 다른 부동 소수점 수에 대해서도 똑같은 일이 발생합니다. 다음은 항상 0.0입니다. 재현ByteBuffer.getFloat가 0.0을 반환하는 이유는 무엇입니까?

float f = byteBuffer.getFloat(4); 
+0

가 나는'ByteBuffer' 당신이 그것을하지 무슨 생각을 포함하지 않는 것으로 판단됩니다. 'getFloat (4)'를 호출하기 직전에'i = 4,5,6,7'에 대해'byteBuffer.get (i)'를 호출하고 네 개의 값을 출력 할 수 있습니까? – NPE

+0

젠장! 나는 ByteBuffer byteBuffer = ByteBuffer.allocate (status.length)를하고 있고, 데이터를 담고있는 것은'status'이다. 나는'.allocate'가 아마도 byteBuffer를 생성 할 것이고 이제는 byte [] 상태를 byteBuffer에 복사 할 필요가있을 것이라고 확신합니다. – jacknad

답변

3

없습니다

import java.nio.ByteBuffer; 

public class Test { 

    public static void main(String[] args) { 
     byte[] bytes = { 0x1, 0x1, 0x1, 0x1, 0x2b, 0x69, (byte) 0x80, 0x3f }; 
     ByteBuffer buffer = ByteBuffer.wrap(bytes); 
     System.out.println(buffer.getFloat(4)); 
    } 
} 

AIX 댓글을 달았습니다, 나는 당신의 버퍼가 정말 당신이하지 무슨 생각을 포함하지 않는 생각한다.

getInt(4)으로 시도하면 어떻게됩니까?

+0

수정하십시오. 그렇지 않았습니다. 원래의 데이터는'status'라고하는 byte []에 있기 때문에'byteBuffer.put (status) '를 할 필요가 있습니다. – jacknad

2

당신이 읽은 후 버퍼가 뒤집히지 않는다고 생각합니다. 마지막으로 쓰여진 것을 읽은 후에 읽는 것을 의미합니다.

ByteBuffer buffer = ByteBuffer.allocate(8); 
buffer.putFloat(1.2345f); 
float f = buffer.getFloat(); // equals 0.0 
System.out.println("before flip "+f); 

buffer.flip(); 
float f2 = buffer.getFloat(); // equals 1.2345 
System.out.println("after flip "+f2); 

인쇄

before flip 0.0 
after flip 1.2345 
+0

ByteBuffer buffer = ByteBuffer.allocate (4)? – jacknad

+0

이 예제에는 없습니다. 그렇게하면 예외가 발생합니다. –

+0

예. 그게했다. 그것은 이상했다. 자바는 float에 8 바이트가 필요합니까? – jacknad