2012-01-18 6 views
1

ByteBuffer byteBuffer получен через соединение TCP/IP, отображается в эмуляторе NetBeans и содержит 0x2b, 0x69, 0x80 и 0x3f в байтах 4, 5, 6 и 7 для этого разрыва. Если endianess ошибочно, я ожидаю либо неправильное значение float, либо, возможно, какое-то число числового исключения, но не всегда 0.0 для различных наборов из 4 байтов. То же самое происходит для ряда других поплавков, считанных из этого ByteBuffer, по индексу 8, 12 и т. Д. Почему всегда всегда 0.0?Почему ByteBuffer.getFloat возвращает 0.0?

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

Я подозреваю, что 'ByteBuffer' не содержит то, что вы думаете, что он делает. Не могли бы вы называть 'byteBuffer.get (i)' for 'i = 4,5,6,7' непосредственно перед вызовом' getFloat (4) 'и распечатывать четыре значения? – 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', поэтому мне нужно сделать' 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

Да. Так оно и было. Это было странно. Требуется ли java для байтов 8 байтов? – jacknad