Ist dies ein korrekter Ansatz, um ByteBuffer auf diese Weise in String zu konvertieren,
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");
Ich frage deshalb, dass dies zu einfach aussieht, während andere Ansätze wie Java: Konvertieren von String in und aus ByteBuffer und damit verbundene Probleme komplexer erscheinen.
EDIT (2018): Die bearbeitete Antwort von @xinyongCheng für Geschwister ist eine einfachere Methode und sollte die akzeptierte Antwort sein.
Ihr Ansatz wäre sinnvoll, wenn Sie wüssten, dass sich die Bytes im Standardzeichensatz der Plattform befinden. In Ihrem Beispiel ist dies der Fall, da k.getBytes()
die Bytes im Standardzeichensatz der Plattform zurückgibt.
Häufiger möchten Sie die Kodierung angeben. Es gibt jedoch einen einfacheren Weg als die Frage, die Sie verlinkt haben. Die String-API stellt Methoden bereit, die zwischen einem String und einem Byte [] -Array in einer bestimmten Codierung konvertiert werden. Diese Methoden empfehlen die Verwendung von CharsetEncoder/CharsetDecoder "wenn mehr Kontrolle über den Dekodierungsprozess [encoding] erforderlich ist."
Um die Bytes aus einer Zeichenfolge in einer bestimmten Kodierung abzurufen, können Sie die gleichnamige getBytes () -Methode verwenden:
byte[] bytes = k.getBytes( StandardCharsets.UTF_8 );
Um Bytes mit einer bestimmten Kodierung in einen String zu setzen, können Sie einen anderen String-Konstruktor verwenden:
String v = new String( bytes, StandardCharsets.UTF_8 );
Beachten Sie, dass ByteBuffer.array()
eine optionale Operation ist. Wenn Sie Ihren ByteBuffer mit einem Array erstellt haben, können Sie dieses Array direkt verwenden. Andernfalls verwenden Sie ByteBuffer.get(byte[] dst, int offset, int length)
, wenn Sie sicher sein möchten, um Bytes aus dem Puffer in ein Byte-Array zu holen.
Es gibt einen einfacheren Ansatz, eine ByteBuffer
ohne Probleme in eine String
zu decodieren, die von Andy Thomas erwähnt wird.
String s = StandardCharsets.UTF_8.decode(byteBuffer).toString();
Versuche dies:
new String(bytebuffer.array(), "ASCII");
NB. Sie können ein Byte-Array nicht korrekt in einen String konvertieren, ohne dessen Codierung zu kennen.
Ich hoffe das hilft
Ich möchte nur darauf hinweisen, dass ByteBuffer.array () immer funktionieren wird.
byte[] bytes;
if(buffer.hasArray()) {
bytes = buffer.array();
} else {
bytes = new byte[buffer.remaining()];
buffer.get(bytes);
}
String v = new String(bytes, charset);
In der Regel wird buffer.hasArray () je nach Anwendungsfall immer true oder false sein. In der Praxis ist es sicher, den Zweig, den Sie nicht benötigen, zu optimieren. Die übrigen Antworten funktionieren jedoch möglicherweise nicht mit einem ByteBuffer, der mit ByteBuffer.allocateDirect () erstellt wurde.
Die Antworten, die sich auf das einfache Aufrufen von array()
beziehen, sind nicht ganz korrekt: Wenn der Puffer teilweise verbraucht wurde oder sich auf einen Teil eines Arrays bezieht (Sie können ByteBuffer.wrap
ein Array mit einem bestimmten Offset und nicht unbedingt von Anfang an), müssen wir berücksichtigen dies in unseren Berechnungen. Dies ist die allgemeine Lösung, die in allen Fällen für Puffer funktioniert (deckt nicht die Codierung ab):
if (myByteBuffer.hasArray()) {
return new String(myByteBuffer.array(),
myByteBuffer.arrayOffset() + myByteBuffer.position(),
myByteBuffer.remaining());
} else {
final byte[] b = new byte[myByteBuffer.remaining()];
myByteBuffer.duplicate().get(b);
return new String(b);
}
Zu den Bedenken bezüglich der Kodierung siehe die Antwort von Andy Thomas.
Konvertiere einen String in ByteBuffer und dann mit Java von ByteBuffer zurück in 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();
}
Welches druckt zuerst die gedruckte leere Zeichenfolge und dann den ByteBuffer, der in array () umgewandelt wird:
obufscate thdé alphebat and yolo!!
obufscate thdé alphebat and yolo!!
Dies war auch für mich hilfreich, da die Zeichenfolge auf primitive Bytes reduziert werden kann, um zu überprüfen, was los ist:
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);
Druckt Ihre Zeichenfolge als UTF-8 und dann erneut als ISO-8859-1:
こんにちは
ããã«ã¡ã¯
Beachten Sie (abgesehen vom Codierungsproblem), dass einige der komplizierteren verknüpften Codes die Mühe haben, den "aktiven" Teil des betreffenden ByteBuffers abzurufen (z. B. durch Verwendung von position und limit), anstatt nur alle Bytes zu codieren im gesamten Hintergrundarray (wie viele der Beispiele in diesen Antworten).
private String convertFrom(String lines, String from, String to) {
ByteBuffer bb = ByteBuffer.wrap(lines.getBytes());
CharBuffer cb = Charset.forName(to).decode(bb);
return new String(Charset.forName(from).encode(cb).array());
};
public Doit(){
String concatenatedLines = convertFrom(concatenatedLines, "CP1252", "UTF-8");
};