好的,我对Java很陌生,所以如果这个问题很愚蠢我会道歉。
我有一个ByteBuffer对象,其中包含的值可能是任意长度的字节数,缓冲区的容量设置为长度。将缓冲区中的值读入适当的原始类型的最有效方法是什么?
以下代码代表我的问题。
long returnValue;
ByteBuffer bb = GetBuffer(blah);
if (bb.capacity() > 4)
{
returnValue = (long) <how to get value from the buffer here?>
}
else if (bb.capacity() > 2)
{
returnValue = (long) <and here...>
}
// etc...
如果缓冲区的限制小于8,则在缓冲区上调用getLong()会导致异常。我想我可以从单个字节构造一个long,但这似乎不必要地复杂化。还有更好的方法吗?
非常感谢!
答案 0 :(得分:2)
ByteBuffer有一些特殊的“获取”方法,例如getLong(int index)
:
if (bb.capacity() >= 8)
{
returnValue = bb.getLong();
}
答案 1 :(得分:2)
如果缓冲区的限制小于8,则在缓冲区上调用getLong()会导致异常。
这是因为长是 8个字节。请参阅Primitive Data Types。
如果你想创建一个长任意数量的字节,我建议你只需插入零填充它并使用getLong()
。 (见下面的例子。)
如果你想用4个字节创建一个long
,你可以做(long) bb.getInt()
之类的事情。
最后,除非您使用ByteBuffer.remaining()
而不是ByteBuffer.capacity()
,否则我建议您长时间使用绝对get方法:ByteBuffer.getLong(0)
。
我想我可以从单个字节构造一个long,但这似乎不必要地复杂化。有更好的方法吗?
是的,还有更好的方法。这是一个可以帮助您入门的示例程序:
import java.nio.ByteBuffer;
public class Main {
static ByteBuffer longBuf = ByteBuffer.allocate(8);
public static long getLong(ByteBuffer bb) {
// Fill with eight 0-bytes and set position.
longBuf.putLong(0, 0).position(8 - bb.remaining());
// Put the remaining bytes from bb, and get the resulting long.
return longBuf.put(bb).getLong(0);
}
public static void main(String[] args) {
ByteBuffer bb = ByteBuffer.allocate(10);
// Add 2 bytes
bb.put((byte) 5);
bb.put((byte) 7);
// Prepare to read
bb.flip();
long l = getLong(bb);
System.out.println(Long.toBinaryString(l)); // Prints 10100000111
// Correct since, 00000101 00000111
// |--------|--------|
// 5 7
}
}