在Java中,如何将字节数组转换为特定的基本类型,具体取决于数组的大小?

时间:2010-11-09 07:24:29

标签: java

好的,我对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,但这似乎不必要地复杂化。还有更好的方法吗?

非常感谢!

2 个答案:

答案 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
    }
}