I have a byte[] bytes
from a ByteBuffer
which contains a packet. I want to put the packet in a String
.
Currently I have the following
byte[] bytes = packet.array();
System.out.println("Packet String:" + new String(bytes));
But then I end up with the following output
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��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
I've tried it with encoding like this
System.out.println("Packet String:" + new String(bytes, Charset.forName("UTF-8")));
But that isn't the right charset. Can anybody tell me what is?
You need to use the buffer's position and limit to determine the number of bytes to read.
// ...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);
In my opinion you shouldn't really be using the backing array()
at all; it's bad practice. Direct byte buffers (created by ByteBuffer.allocateDirect()
won't have a backing array and will throw an exception when you try to call ByteBuffer.array()
. Because of this, for portability you should try to stick to the standard buffer get
and put
methods. Of course, if you really want to use the array you can use ByteBuffer.hasArray()
to check if the buffer has a backing array.