在Java中将ByteBuffer转换为String

Lia*_*aas 7 java bytebuffer bytearray

我有一个byte[] bytesByteBuffer其中包含一个数据包.我想把数据包放入String.

目前我有以下内容

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

但后来我得到了以下输出

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??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我用这样的编码尝试过它

System.out.println("Packet String:" + new String(bytes, Charset.forName("UTF-8")));
Run Code Online (Sandbox Code Playgroud)

但那不是正确的字符集.任何人都可以告诉我什么是?

kuu*_*ujo 9

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

// ...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);
Run Code Online (Sandbox Code Playgroud)

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


use*_*421 0

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

new String(buffer.array(), 0, buffer.position())
Run Code Online (Sandbox Code Playgroud)

然后重置它。

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