Ich muss ein Byte-Array in Android in einen String konvertieren, aber mein Byte-Array enthält negative Werte.
Wenn ich diese Zeichenfolge erneut in ein Byte-Array konvertiere, unterscheiden sich die Werte, die ich erhalte, von den ursprünglichen Byte-Array-Werten.
Was kann ich tun, um eine ordnungsgemäße Konvertierung zu erzielen? Der Code, den ich für die Konvertierung verwende, lautet wie folgt:
// Code to convert byte arr to str:
byte[] by_original = {0,1,-2,3,-4,-5,6};
String str1 = new String(by_original);
System.out.println("str1 >> "+str1);
// Code to convert str to byte arr:
byte[] by_new = str1.getBytes();
for(int i=0;i<by_new.length;i++)
System.out.println("by1["+i+"] >> "+str1);
Ich stecke in diesem Problem fest.
byte[]
für Ihre Binärdaten undString
für Ihren Text zu verwenden?Antworten:
Ihr Byte-Array muss eine Codierung haben. Die Codierung kann nicht ASCII sein, wenn Sie negative Werte haben. Sobald Sie das herausgefunden haben, können Sie eine Reihe von Bytes in einen String konvertieren, indem Sie:
Es gibt eine Reihe von Codierungen, die Sie verwenden können. Schauen Sie sich die Charset-Klasse in den Sun-Javadocs an .
quelle
UTF-8
?String str = new String(bytes, java.nio.charset.StandardCharsets.ISO_8859_1);
Die "richtige Konvertierung" zwischen
byte[]
undString
besteht darin, die zu verwendende Codierung explizit anzugeben. Wenn Sie mit a beginnenbyte[]
und es tatsächlich keine Textdaten enthält, gibt es keine "ordnungsgemäße Konvertierung".String
s sind für Text,byte[]
für Binärdaten, und das einzig wirklich Sinnvolle ist, die Konvertierung zwischen ihnen zu vermeiden , es sei denn, Sie müssen dies unbedingt tun .Wenn Sie wirklich a verwenden müssen
String
, um Binärdaten zu speichern, ist die Verwendung der Base64- Codierung der sicherste Weg .quelle
Das Grundproblem ist (glaube ich), dass Sie unabsichtlich einen Zeichensatz verwenden, für den:
in manchen Fällen. UTF-8 ist ein Beispiel für einen solchen Zeichensatz. Insbesondere sind bestimmte Folgen von Bytes keine gültigen Codierungen in UTF-8. Wenn der UTF-8-Decoder auf eine dieser Sequenzen stößt, kann er die fehlerhaften Bytes verwerfen oder als Unicode-Codepunkt für "kein solches Zeichen" decodieren. Wenn Sie dann versuchen, die Zeichen als Bytes zu codieren, ist das Ergebnis natürlich anders.
Die Lösung ist:
String.toByteArray
Methode mit einem expliziten Zeichensatz.quelle
Wir müssen nur ein neues
String
mit dem Array erstellen: http://www.mkyong.com/java/how-do-convert-byte-array-to-string-in-java/Die Bytes der resultierenden Zeichenfolge unterscheiden sich je nachdem, welchen Zeichensatz Sie verwenden. Der neue String (Bytes) und der neue String (Bytes, Charset.forName ("utf-8")) sowie der neue String (Bytes, Charset.forName ("utf-16")) haben alle unterschiedliche Byte-Arrays, wenn Sie String # aufrufen getBytes () (abhängig vom Standardzeichensatz)
quelle
new String(bytes)
undnew String(bytes, Charset.forName("utf-8"))
undnew String(bytes, Charset.forName("utf-16"))
alle haben unterschiedliche Byte-Arrays, wenn Sie aufrufenString#getBytes()
(abhängig vom Standard-Zeichensatz)char
s (und damit der angezeigte Text) des ErgebnissesString
unterscheidet sich bei der Dekodierungbytes
unterschiedlich. Die Konvertierung zurück in Bytes unter Verwendung der Standardcodierung (verwenden SieString#getBytes("charset")
, um etwas anderes anzugeben) unterscheidet sich notwendigerweise, da unterschiedliche Eingaben konvertiert werden. Strings speichern nicht die, aus denenbyte[]
sie gemacht wurden,char
s haben keine Codierung und aString
speichert sie nicht anders.Das Verwenden
new String(byOriginal)
und Zurückkonvertieren in dasbyte[]
VerwendengetBytes()
garantiert nicht zweibyte[]
mit gleichen Werten. Dies ist auf einen Aufruf zurückzuführen,StringCoding.encode(..)
der dasString
to codiertCharset.defaultCharset()
. Während dieser Codierung kann der Codierer unbekannte Zeichen ersetzen und andere Änderungen vornehmen. Daher gibt usingString.getBytes()
möglicherweise nicht das gleiche Array zurück, wie Sie es ursprünglich an den Konstruktor übergeben haben.quelle
Warum war das Problem: Wie bereits jemand angegeben: Wenn Sie mit einem Byte [] beginnen und es tatsächlich keine Textdaten enthält, gibt es keine "richtige Konvertierung". Zeichenfolgen sind für Text, Byte [] für Binärdaten, und das einzig wirklich Sinnvolle ist, die Konvertierung zwischen ihnen zu vermeiden, es sei denn, Sie müssen dies unbedingt tun.
Ich habe dieses Problem beobachtet, als ich versucht habe, Byte [] aus einer PDF-Datei zu erstellen, es dann in einen String zu konvertieren und dann den String als Eingabe zu nehmen und wieder in eine Datei zu konvertieren.
Stellen Sie also sicher, dass Ihre Kodierungs- und Dekodierungslogik mit meiner identisch ist. Ich habe das Byte [] explizit in Base64 codiert und dekodiert, um die Datei erneut zu erstellen.
Use-Case: Aufgrund einiger Einschränkung Ich habe versucht , zu abgeschickt
byte[]
inrequest(POST)
und das Verfahren war wie folgt:PDF-Datei >> Base64.encodeBase64 (Byte []) >> String >> Anfrage senden (POST) >> String empfangen >> Base64.decodeBase64 (Byte []) >> Binärdatei erstellen
Versuchen Sie dies und das hat bei mir funktioniert ..
quelle
Das funktioniert gut für mich:
Konvertieren von Zeichenfolge in Byte []:
Konvertieren von Byte [] in Zeichenfolge:
quelle
quelle
Ich habe etwas bemerkt, das in keiner der Antworten enthalten ist. Sie können jedes der Bytes im Byte-Array in Zeichen umwandeln und in ein char-Array einfügen. Dann ist die Zeichenfolge
Dabei ist cbuf das char-Array. Um zurück zu konvertieren, durchlaufen Sie die Zeichenfolge, die jedes der Zeichen in Bytes umwandelt, um sie in ein Byte-Array einzufügen. Dieses Byte-Array ist das gleiche wie das erste.quelle
javax.xml.bind.DatatypeConverter
Sollte es tun:quelle
Hier sind einige Methoden, die ein Array von Bytes in eine Zeichenfolge konvertieren. Ich habe sie getestet, sie funktionieren gut.
quelle
Obwohl
ist richtig, es wirft ein,
UnsupportedEncodingException
was Sie zwingt, mit einer aktivierten Ausnahme umzugehen. Sie können alternativ einen anderen Konstruktor seit Java 1.6 verwenden, um ein Byte-Array in Folgendes zu konvertierenString
:Dieser wirft keine Ausnahme.
Das Zurückkonvertieren sollte auch erfolgen mit
StandardCharsets.UTF_8
:Auch hier müssen Sie sich nicht mit geprüften Ausnahmen befassen.
quelle
Mit dieser Methode konnte ich das Byte-Array in einen String konvertieren:
quelle
Während die Base64-Codierung sicher ist und man "die richtige Antwort" argumentieren könnte, bin ich hier angekommen und habe nach einer Möglichkeit gesucht, ein Java-Byte-Array so wie es ist in einen Java-String zu konvertieren. Das heißt, wo jedes Mitglied des Byte-Arrays in seinem String-Gegenstück intakt bleibt, ohne dass zusätzlicher Speicherplatz für die Codierung / den Transport erforderlich ist.
Diese Antwort , die transparente 8-Bit-Codierungen beschreibt, war für mich sehr hilfreich. Ich habe
ISO-8859-1
Terabyte an Binärdaten verwendet, um erfolgreich hin und her zu konvertieren (binäre <-> Zeichenfolge), ohne den für eine Base64-Codierung erforderlichen überhöhten Speicherplatzbedarf zu haben. Dies ist für meinen Anwendungsfall - YMMV - sicher.Dies war auch hilfreich, um zu erklären, wann / ob Sie experimentieren sollten.
quelle
quelle
Hier der Arbeitscode.
quelle
Versuchen Sie, in beiden Konvertierungen einen 8-Bit-Zeichensatz anzugeben. Zum Beispiel ISO-8859-1.
quelle
Lesen Sie die Bytes aus der
String
VerwendungByteArrayInputStream
und umschließen Sie sie mitBufferedReader
Char Stream anstelle von Byte Stream, der die Bytedaten in String konvertiert.Ausgabe ist:
quelle
Sie können die einfache for-Schleife für die Konvertierung verwenden:
quelle
quelle
Ein String ist eine Sammlung von Zeichen (16 Bit ohne Vorzeichen). Wenn Sie also negative Zahlen in eine Zeichenfolge konvertieren, gehen diese bei der Übersetzung verloren.
quelle
quelle
Verwenden Sie Base64 und lösen Sie Ihr Problem. Es ist zu einfach zu bedienen. http://iharder.sourceforge.net/current/java/base64/
quelle