快速ByteBuffer到CharBuffer或char []

tow*_*owi 5 java arrays nio bytebuffer bytearray

什么是一个转换最快的方法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)
Run Code Online (Sandbox Code Playgroud)

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

之后我还需要相反的翻译:最有效的方式来获得char[]java.nio.CharBuffer重新进入java.nio.ByteBuffer.

Paŭ*_*ann 12

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

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

CharBuffer result = Charset.forName("ISO-8859-1").decode(byteBuffer);
Run Code Online (Sandbox Code Playgroud)

另一个方向是:

ByteBuffer result = Charset.forName("ISO-8859-1").encode(charBuffer);
Run Code Online (Sandbox Code Playgroud)

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

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

CharBuffer result = StandardCharsets.ISO_8859_1.decode(byteBuffer);
Run Code Online (Sandbox Code Playgroud)

ByteBuffer result = StandardCharsets.ISO_8859_1.encode(charBuffer);
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*rey 5

我同意@ 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);
Run Code Online (Sandbox Code Playgroud)