我有一个来自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��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
但那不是正确的字符集。谁能告诉我是什么?
答案 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()
时会抛出异常。因此,为了便于携带,您应该尝试坚持标准缓冲区get
和put
方法。当然,如果您真的想使用该数组,可以使用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”);