5

将 ajava.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具有相同(低 8 位)位char:128。因此,我假设“最佳”解释就像我上面提到的那样,因为位是相同的。

之后我还需要反之亦然的翻译:获取char[]java.nio.CharBuffer返回到java.nio.ByteBuffer.

4

3 回答 3

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 开始,还有带有预实例化 Charset 实例的StandardCharsets类,因此您可以使用

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

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

反而。(这些行与前面的行相同,只是查找更容易,没有错误输入名称的风险,也不需要捕获不可能的异常。)

于 2011-05-09T12:36:29.117 回答
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);
于 2011-05-09T12:10:43.000 回答
0

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

于 2011-06-05T18:02:39.733 回答