快速ByteBuffer到CharBuffer或char

java.nio.ByteBuffer a转换为(新创建的) CharBuffer bchar[] b的最快方法是什么?

通过这样做很重要, a[i] == b[i] 。 这意味着,不是a[i]a[i+1]一起组成一个值b[j]getChar(i)会做什么,但这些值应该是“传播”。

 byte a[] = { 1,2,3, 125,126,127, -128,-127,-126 } // each a byte (which are signed) char b[] = { 1,2,3, 125,126,127, 128, 129, 130 } // each a char (which are unsigned) 

请注意, byte:-128char:128具有相同(低8位)的位。 因此,我假设“最佳”解释将如上所述,因为位是相同的。

之后我还需要相反的翻译:将char[]java.nio.CharBuffer重新放回java.nio.ByteBuffer的最有效方法。

所以,你想要的是使用编码ISO-8859-1进行转换。

我对效率没有任何要求,但至少写起来很短:

 CharBuffer result = Charset.forName("ISO-8859-1").decode(byteBuffer); 

另一个方向是:

 ByteBuffer result = Charset.forName("ISO-8859-1").encode(charBuffer); 

请根据其他解决方案进行衡量。 (公平地说,不应该包含Charset.forName部分,也应该只进行一次,而不是再次为每个缓冲区。)

从Java 7开始,还有带有预先实例化的Charset实例的StandardCharsets类,因此您可以使用

 CharBuffer result = StandardCharsets.ISO_8859_1.decode(byteBuffer); 

 ByteBuffer result = StandardCharsets.ISO_8859_1.encode(charBuffer); 

代替。 (这些行与之前的行相同,只是查找更容易,并且没有错误输入名称的风险,也不需要捕获不可能的exception。)

我同意@ Ishtar的建议,建议完全避免转换为新结构,只能根据需要进行转换。

但是,如果你有一个堆ByteBuffer你可以做。

 ByteBuffer bb = ... byte[] array = bb.array(); char[] chars = new char[bb.remaining()]; for (int i = 0; i < chars.length; i++) chars[i] = (char) (array[i + bb.position()] & 0xFF); 

除了推迟CharBuffer的创建之外,你可以在没有人的情况下顺利过关。 如果使用数据作为字符的代码并不严格需要CharBuffer或char [],那么只需进行简单的即时转换即可; 使用ByteBuffer.get()(相对或绝对),转换为char(注意:如所指出的,你必须明确掩盖事物;否则值128-255将被符号扩展为不正确的值,0xFF80 – 0xFFFF;不需要7位ASCII),并使用它。