将java.nio.ByteBuffer a
转换为(新创建的)CharBuffer b
或char[] 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:-128
请注意,char:128
与char[]
具有相同(低8位)的位。因此,我假设“最佳”解释将如上所述,因为位是相同的。
之后我还需要反之亦然翻译:将java.nio.CharBuffer
或java.nio.ByteBuffer
带回{{1}}的最有效方法。
答案 0 :(得分:12)
所以,你想要的是使用编码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开始,还有StandardCharsets类,其中包含预先实例化的Charset实例,因此您可以使用
CharBuffer result = StandardCharsets.ISO_8859_1.decode(byteBuffer);
和
ByteBuffer result = StandardCharsets.ISO_8859_1.encode(charBuffer);
代替。 (这些行与之前的行相同,只是查找更容易,并且没有错误输入名称的风险,也不需要捕获不可能的异常。)
答案 1 :(得分: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);
答案 2 :(得分:0)
除了延迟创建CharBuffer之外,你可以在没有人的情况下顺利过关。 如果使用数据作为字符的代码并不严格需要CharBuffer或char [],那么只需进行简单的即时转换即可;使用ByteBuffer.get()(相对或绝对),转换为char(注意:如指出的那样,你必须明确掩盖事物;否则值128-255将被符号扩展为不正确的值,0xFF80 - 0xFFFF;不需要7位ASCII),并使用它。