在Java中将ByteBuffer转换为String

时间:2015-03-22 03:36:46

标签: java bytearray bytebuffer

我有一个来自byte[] bytes的{​​{1}},其中包含一个数据包。我想将数据包放在ByteBuffer

目前我有以下

String

然后我最终得到以下输出

    byte[] bytes = packet.array();
    System.out.println("Packet String:" + new String(bytes));

我已尝试过像这样的编码

Packet String:E����<Ҧ@��@�.
03-22 04:30:28.187   9296-10152/willem.com.vpn I/System.out﹕ ����J}�j���k�:����������9�������
03-22 04:30:28.197   9296-10152/willem.com.vpn I/System.out﹕ ��&�4��������ddrarpa��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

但那不是正确的字符集。谁能告诉我是什么?

4 个答案:

答案 0 :(得分:8)

您需要使用缓冲区的位置和限制来确定要读取的字节数。

// ...populate the buffer...
buffer.flip(); // flip the buffer for reading
byte[] bytes = new byte[buffer.remaining()]; // create a byte array the length of the number of bytes written to the buffer
buffer.get(bytes); // read the bytes that were written
String packet = new String(bytes);

在我看来,你根本不应该使用支持array();这是一种不好的做法。直接字节缓冲区(由ByteBuffer.allocateDirect()创建)不会有支持数组,并且当您尝试调用ByteBuffer.array()时会抛出异常。因此,为了便于携带,您应该尝试坚持标准缓冲区getput方法。当然,如果您真的想使用该数组,可以使用ByteBuffer.hasArray()来检查缓冲区是否有后备数组。

答案 1 :(得分:1)

在一般情况下,关于从位置到限制的设置范围的答案是不正确的。当缓冲区已被部分消耗,或者指的是数组的一部分时(您可以ByteBuffer.wrap给定偏移量的数组,不一定从一开始),我们必须在计算中考虑到这一点。这是适用于所有情况下缓冲区的一般解决方案(不包括编码):

if (myByteBuffer.hasArray()) {
    return new String(myByteBuffer.array(),
        myByteBuffer.arrayOffset() + myByteBuffer.position(),
        myByteBuffer.remaining());
} else {
    final byte[] b = new byte[myByteBuffer.remaining()];
    myByteBuffer.duplicate().get(b);
    return new String(b);
}

有关编码的问题,请参阅Andy Thomas的回答。

答案 2 :(得分:0)

你忽略了缓冲区的limit。您应该flip()缓冲区,然后调用

new String(buffer.array(), 0, buffer.position())

然后重置它。

但你真的应该使用Charset解码器为此产生CharBuffer。至少你应该为String构造函数指定一个字符集。

答案 3 :(得分:0)

ByteBuffer数据= ...

新字符串(data.array(),“ UTF-8”);