2012-01-18 115 views
1

ByteBuffer byteBuffer通过TCP/IP连接接收,在NetBeans模拟器中可见,并且包含此中断的字节4,5,6和7中的0x2b,0x69,0x80和0x3f。 如果endianess是错误的,我会期望一个不正确的浮点值或可能某种类型的数值异常,但不是总是为0.0的各种4字节组。 同样的事情发生在从这个ByteBuffer读取的索引8,12等处的其他一些浮点数上。为什么以下总是0.0?为什么ByteBuffer.getFloat返回0.0?

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

我怀疑'ByteBuffer'不包含你所想象的那样。在你调用'getFloat(4)'之前,你可以调用'byteBuffer.get(i)'作为'i = 4,5,6,7',并打印出四个值吗? – NPE 2012-01-18 16:03:04

+0

该死!我正在做一个'ByteBuffer byteBuffer = ByteBuffer.allocate(status.length)',它是'status'包含数据。我确定'.allocate'可能只是创建了byteBuffer,现在我需要将byte []状态复制到byteBuffer。 – jacknad 2012-01-18 16:12:06

回答

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 2012-01-18 16:19:54

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 2012-01-18 19:37:50

+0

不适用于本示例。如果你这样做,它会抛出异常。 – 2012-01-18 20:12:26

+0

是的。它做了。那很奇怪。 java是否需要8个字节的浮点数? – jacknad 2012-01-19 02:57:47