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");
Der Grund, den ich frage, ist, dass dies zu einfach aussieht, während andere Ansätze wie Java: Das Konvertieren von Zeichenfolgen in und aus ByteBuffer und die damit verbundenen Probleme komplexer aussehen.
java
string
serialization
bytearray
vikky.rk
quelle
quelle
Antworten:
EDIT (2018): Die bearbeitete Geschwisterantwort von @xinyongCheng ist ein einfacherer Ansatz und sollte die akzeptierte Antwort sein.
Ihr Ansatz wäre vernünftig, wenn Sie wüssten, dass die Bytes im Standardzeichensatz der Plattform enthalten sind. In Ihrem Beispiel ist dies wahr, weil
k.getBytes()
die Bytes im Standardzeichensatz der Plattform zurückgegeben werden.Häufiger möchten Sie die Codierung angeben. Es gibt jedoch einen einfacheren Weg, dies zu tun als die von Ihnen verknüpfte Frage. Die String-API bietet Methoden, die in einer bestimmten Codierung zwischen einem String- und einem Byte [] -Array konvertieren. Diese Methoden empfehlen die Verwendung von CharsetEncoder / CharsetDecoder "wenn mehr Kontrolle über den Decodierungsprozess erforderlich ist".
Um die Bytes aus einem String in einer bestimmten Codierung abzurufen, können Sie eine Geschwister-Methode getBytes () verwenden:
Um Bytes mit einer bestimmten Codierung in einen String einzufügen, können Sie einen anderen String-Konstruktor verwenden:
Beachten Sie, dass dies
ByteBuffer.array()
eine optionale Operation ist. Wenn Sie Ihren ByteBuffer mit einem Array erstellt haben, können Sie dieses Array direkt verwenden. Wenn Sie andernfalls sicher sein möchten, verwenden SieByteBuffer.get(byte[] dst, int offset, int length)
, um Bytes aus dem Puffer in ein Byte-Array zu übertragen.quelle
ByteBuffer.get
Funktion ist die Eingabe wieder ein Array von Bytes, wie kann ich es bekommen? es macht keinen Sinn, noch einmal k.getbytes zu sagen, oder?ByteBuffer.get(byte[] dst, int offset, int length)
. Sie können daraus einen String mit dem String () -Konstruktor `String (Byte [] Bytes, Int-Offset, Int-Länge, Zeichensatz-Zeichensatz) erstellen. Sie können für beide Aufrufe dieselben Offset- und Längenwerte verwenden.k
handelt es sich um einen String und nicht um einen ByteBuffer.Es gibt einen einfacheren Ansatz, um a ohne Probleme
ByteBuffer
in ein zu dekodierenString
, wie von Andy Thomas erwähnt.quelle
CharBuffer
decode()
ist kehrt einCharSequence
(wieString
), so dass Sie eine zusätzliche Kopie vermeiden können und es direkt verwenden.Versuche dies:
NB. Sie können ein Byte-Array nicht korrekt in einen String konvertieren, ohne dessen Codierung zu kennen.
ich hoffe das hilft
quelle
.array()
kann eine Ausnahme ausgelöst werden..array()
Methode.array()
, müssen Sie auch verwendenarrayOffset()
, um an der richtigen Position im Array zu beginnen! Dies ist eine subtile Gefahr, da arrayOffset () normalerweise 0 ist. Aber in den seltenen Fällen, in denen dies nicht der Fall ist, werden Sie schwer zu findende Fehler bekommen, wenn Sie dies nicht berücksichtigen.Ich wollte nur darauf hinweisen, dass es nicht sicher ist anzunehmen, dass ByteBuffer.array () immer funktioniert.
Normalerweise ist buffer.hasArray () je nach Anwendungsfall immer wahr oder falsch. In der Praxis ist es sicher, den nicht benötigten Zweig zu optimieren, es sei denn, Sie möchten wirklich, dass er unter keinen Umständen funktioniert. Die restlichen Antworten funktionieren jedoch möglicherweise nicht mit einem ByteBuffer, der über ByteBuffer.allocateDirect () erstellt wurde.
quelle
ByteBuffer.wrap(bytes, offset, size)
Factory erstellt.array()
wird, wird das gesamtebytes
Array zurückgegeben. Verwenden Sie besser die von Xinyong Cheng vorgeschlagene Formarray()
, müssen Sie auch verwendenarrayOffset()
, um an der richtigen Position im Array zu beginnen! Dies ist eine subtile Gefahr, da arrayOffset () normalerweise 0 ist. Aber in den seltenen Fällen, in denen dies nicht der Fall ist, werden Sie schwer zu findende Fehler bekommen, wenn Sie dies nicht berücksichtigen.Die Antworten, die sich auf das einfache Aufrufen beziehen,
array()
sind nicht ganz richtig: Wenn der Puffer teilweise verbraucht wurde oder sich auf einen Teil eines Arrays bezieht (Sie könnenByteBuffer.wrap
ein Array mit einem bestimmten Offset erstellen, nicht unbedingt von Anfang an), müssen wir dies berücksichtigen das in unseren Berechnungen. Dies ist die allgemeine Lösung, die in allen Fällen für Puffer funktioniert (gilt nicht für die Codierung):Zu den Bedenken im Zusammenhang mit der Codierung siehe die Antwort von Andy Thomas.
quelle
Beachten Sie (abgesehen vom Codierungsproblem), dass ein Teil des komplizierteren verknüpften Codes dazu führt, dass der "aktive" Teil des betreffenden ByteBuffers abgerufen wird (z. B. durch Verwendung von Position und Limit), anstatt einfach alle Bytes zu codieren im gesamten Hintergrundarray (wie viele der Beispiele in diesen Antworten).
quelle
Konvertieren Sie einen String in ByteBuffer und dann mit Java von ByteBuffer zurück in String:
Womit zuerst die gedruckte bloße Zeichenfolge und dann der in array () umgesetzte ByteBuffer gedruckt werden:
Auch dies war für mich hilfreich. Wenn Sie die Zeichenfolge auf primitive Bytes reduzieren, können Sie überprüfen, was gerade passiert:
Druckt Ihre Zeichenfolge als UTF-8 und dann erneut als ISO-8859-1:
quelle
Die Wurzel dieser Frage ist wie man Bytes in einen String dekodiert.
Dies kann mit dem JAVA NIO CharSet erfolgen:
public final CharBuffer decode(ByteBuffer bb)
quelle
quelle