147

このように ByteBuffer を String に変換するのは正しいアプローチですか?

String k = "abcd";
ByteBuffer b = ByteBuffer.wrap(k.getBytes());
String v = new String(b.array());

if(k.equals(v))
    System.out.println("it worked");
else
    System.out.println("did not work");

私が尋ねる理由は、 Java のような他のアプローチ: ByteBuffer との間で文字列を変換し、関連する問題がより複雑に見えるのに対し、これは単純すぎるように見えるからです。

4

11 に答える 11

148

問題なくaByteBufferを aにデコードする簡単な方法があり、Andy Thomas が言及しています。String

String s = StandardCharsets.UTF_8.decode(byteBuffer).toString();
于 2016-10-04T06:01:33.003 に答える
88

編集 (2018): @xinyongCheng による編集された兄弟の回答は、より単純なアプローチであり、受け入れられる回答である必要があります。

バイトがプラットフォームのデフォルトの文字セットにあることがわかっている場合、あなたのアプローチは合理的です。k.getBytes()あなたの例では、プラットフォームのデフォルトの文字セットでバイトを返すため、これは当てはまります。

多くの場合、エンコーディングを指定する必要があります。ただし、リンクした質問よりも簡単な方法があります。String API は、特定のエンコーディングで String と byte[] 配列を変換するメソッドを提供します。これらのメソッドは、「デコード [エンコード] プロセスをより詳細に制御する必要がある場合」にCharsetEncoder/CharsetDecoder を使用することを提案しています。

特定のエンコーディングで文字列からバイトを取得するには、兄弟の getBytes() メソッドを使用できます。

byte[] bytes = k.getBytes( StandardCharsets.UTF_8 );

特定のエンコーディングのバイトを String に入れるには、別の String コンストラクタを使用できます。

String v = new String( bytes, StandardCharsets.UTF_8 );

ByteBuffer.array()これはオプションの操作であることに注意してください。ByteBuffer を配列で構築した場合は、その配列を直接使用できます。それ以外の場合は、安全を確保するために、 を使用ByteBuffer.get(byte[] dst, int offset, int length)してバッファーからバイト配列にバイトを取得します。

于 2013-06-28T00:06:21.673 に答える
17

これを試して:

new String(bytebuffer.array(), "ASCII");

注意。エンコーディングを知らずに、バイト配列を文字列に正しく変換することはできません。

これが役立つことを願っています

于 2013-06-27T23:34:13.727 に答える
15

指摘したいだけですが、 ByteBuffer.array() が常に機能すると想定するのは安全ではありません。

byte[] bytes;
if(buffer.hasArray()) {
    bytes = buffer.array();
} else {
    bytes = new byte[buffer.remaining()];
    buffer.get(bytes);
}
String v = new String(bytes, charset);

通常、 buffer.hasArray() はユースケースに応じて常に true または false になります。実際には、どのような状況でも本当に動​​作させたい場合を除き、不要なブランチを最適化しても安全です。ただし、残りの回答は、ByteBuffer.allocateDirect() によって作成された ByteBuffer では機能しない場合があります。

于 2015-06-15T22:52:05.743 に答える
1

String を ByteBuffer に変換してから、Java を使用して ByteBuffer から String に戻します。

import java.nio.charset.Charset;
import java.nio.*;

String babel = "obufscate thdé alphebat and yolo!!";
System.out.println(babel);
//Convert string to ByteBuffer:
ByteBuffer babb = Charset.forName("UTF-8").encode(babel);
try{
    //Convert ByteBuffer to String
    System.out.println(new String(babb.array(), "UTF-8"));
}
catch(Exception e){
    e.printStackTrace();
}

最初に印刷された裸の文字列を出力し、次に array() にキャストされた ByteBuffer を出力します。

obufscate thdé alphebat and yolo!!
obufscate thdé alphebat and yolo!!

また、これは私にとって役に立ちました.文字列をプリミティブバイトに減らすと、何が起こっているのかを調べるのに役立ちます:

String text = "こんにちは";
//convert utf8 text to a byte array
byte[] array = text.getBytes("UTF-8");
//convert the byte array back to a string as UTF-8
String s = new String(array, Charset.forName("UTF-8"));
System.out.println(s);
//forcing strings encoded as UTF-8 as an incorrect encoding like
//say ISO-8859-1 causes strange and undefined behavior
String sISO = new String(array, Charset.forName("ISO-8859-1"));
System.out.println(sISO);

UTF-8 として解釈された文字列を出力し、次に ISO-8859-1 として再度出力します。

こんにちは
ããã«ã¡ã¯
于 2016-08-08T18:35:45.373 に答える
0

(エンコーディングの問題は別として) リンクされたより複雑なコードの一部は、単純にすべてのバイトをエンコードするのではなく、問題の ByteBuffer の「アクティブな」部分を取得するという問題に直面していることに注意してください (たとえば、位置と制限を使用することによって)。バッキング配列全体で(これらの回答の例の多くがそうであるように)。

于 2015-07-15T19:30:10.070 に答える