5

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と同じ(下位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部分は含めるべきではありません。また、バッファーごとに再度行うのではなく、1 回だけ実行する必要があります。)

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 に答える