wake-up-neo.com

Java ByteBuffer to String

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.

95
vikky.rk

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.

69
Andy Thomas

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();
54
xinyong Cheng

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

16
Dan Bray

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.

11
Fuwjax

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.

4
Alex Yarmula

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:

こんにちは
ããã«ã¡ã¯
1
Eric Leschinski

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).

1
Jas

die Wurzel dieser Frage ist Wie decodiere ich Bytes in Strings

dies kann mit dem Java NIO CharSet durchgeführt werden:

public final CharBuffer decode(ByteBuffer bb)

 enter image description here

0
宏杰李
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");
};
0
Koenraad Appelo