快速ByteBuffer到CharBuffer或char []

时间:2011-05-09 11:32:29

标签: java bytearray nio bytebuffer arrays

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:-128

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

之后我还需要反之亦然翻译:将java.nio.CharBufferjava.nio.ByteBuffer带回{{1}}的最有效方法。

3 个答案:

答案 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),并使用它。