Wie erkennen Ende von string in byte-array zu string-Konvertierung?
Erhalte ich vom socket einen string in ein byte-array, welches wie folgt Aussehen :
[128,5,6,3,45,0,0,0,0,0]
Die Größe gegeben durch das Netzwerk-Protokoll ist die gesamte Länge der Zeichenfolge (einschließlich Nullen) also , in meinem Beispiel 10.
Wenn ich einfach tun :
String myString = new String(myBuffer);
Habe ich am Ende der Zeichenfolge 5-nicht richtige Art. Die Umwandlung don ' T scheint zu erkennen das Ende der Zeichenkette caracter (0).
Zu Holen Sie sich die richtige Größe und die richtige Zeichenfolge ich dies tun :
int sizeLabelTmp = 0;
//Iterate over the 10 bit to get the real size of the string
for(int j = 0; j<(sizeLabel); j++) {
byte charac = datasRec[j];
if(charac == 0)
break;
sizeLabelTmp ++;
}
//Create a temp byte array to make a correct conversion
byte[] label = new byte[sizeLabelTmp];
for(int j = 0; j<(sizeLabelTmp); j++) {
label[j] = datasRec[j];
}
String myString = new String(label);
Gibt es einen besseren Weg, um das problem umgehen ?
Dank
InformationsquelleAutor grunk | 2011-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
0 ist nicht ein "Ende der Zeichenfolge Zeichen". Es ist nur ein byte. Ob oder nicht es kommt nur am Ende der Schnur hängt davon ab, welche Kodierung du verwendest (und was der text sein kann). Zum Beispiel, wenn Sie verwendet UTF-16, alle anderen byte wäre 0 für ASCII-Zeichen.
Wenn Sie sicher, dass die erste 0 zeigt das Ende der Zeichenfolge, die Sie verwenden können etwas wie der code, den Sie gegeben haben, aber ich würde es umschreiben als:
Ich stark empfehlen, dass Sie nicht nur die Nutzung der Plattform Standard-Codierung - es ist nicht tragbar, und kann auch nicht zulassen, dass für alle Unicode-Zeichen. Jedoch, Sie kann nicht einfach willkürlich entscheiden - Sie brauchen, um sicherzustellen, dass alles produzieren und konsumieren dieser Daten stimmt der Codierung.
Wenn man die Kontrolle über das Protokoll, es wäre viel besser, wenn man einführen könnte, eine Länge Präfix vor dem string, um anzugeben, wie viele bytes in der kodierten form. So würden Sie in der Lage sein zu Lesen, genau die richtige Menge von Daten (ohne "über-Lesen") und Sie wäre in der Lage zu sagen, wenn die Daten abgeschnitten wurde, aus irgendeinem Grund.
ein serialisiertes Java-String" nicht wirklich angeben, was das Serialisierungsformat ist. Wenn die OP wurden mit Hilfe von Java die binäre Serialisierung, er würde nicht tun, diese operation ausdrücklich sowieso... und wenn es eine andere Serialisierungs-format, das wir brauchen, um zu wissen, die.
Wahrscheinlich sollte ich aufhören zu reden... Tatsache ist, ich habe immer die Hölle Weg von Serialisierung und wissen nicht, die details alle sehr gut. JAXB oder JPA ist in der Regel das einzige, was ich auch nur erwägen, eine option.
InformationsquelleAutor Jon Skeet
Kann es zu spät, Aber vielleicht hilft es anderen. Die einfachste Sache, die Sie tun können, ist
new String(myBuffer).trim()
, die Ihnen genau, was Sie wollen.InformationsquelleAutor Yuvi
Können Sie starten immer auf das Ende des byte-Arrays und rückwärts gehen, bis Sie auf die erste nicht-null. Dann einfach kopieren, in ein neues byte und dann Zeichenfolge. Hoffe, das hilft:
Geben Sie ein Ergebnis 4.
InformationsquelleAutor Deco
Strings in Java nicht endete mit einer 0, wie in einigen anderen Sprachen. 0 wird erhalten, wandte sich in die so genannte null-Zeichen, was erlaubt ist, um in einer Zeichenfolge angezeigt werden. Ich schlage vor, Sie verwenden einige Trimm-Schema, das entweder erkennt der erste index des Arrays ist 0 und verwendet ein sub-array zu konstruieren String (vorausgesetzt, der ganze rest wird 0 danach), oder einfach nur bauen Sie die Zeichenfolge, und nennen
trim()
. Das wird entfernen Sie führende und nachfolgende Leerzeichen, die sind alle Zeichen mit ASCII-code 32 oder niedriger.Letzteres wird nicht funktionieren, wenn Sie haben eine führende whitespace-Zeichen, die Sie bewahren muss. Mit einem StringBuilder-Objekt und löschen von Zeichen am Ende, wie lange, wie Sie das null-Zeichen würde besser funktionieren in diesem Fall.
InformationsquelleAutor G_H
Erscheint es mir, dass Sie ignorieren die read-count zurückgegeben von der read () - Methode. Die abschließenden null-bytes wahrscheinlich nicht geschickt, Sie sind wahrscheinlich noch übrig von dem ursprünglichen Zustand des Puffers.
dann das Protokoll muss Ihnen sagen, wie viel es ist die Zeichenfolge, die entweder von null-terminierende oder eine Länge Präfix.
InformationsquelleAutor user207421
Nicht zu Tauchen in das Protokoll überlegungen, dass der ursprüngliche OP erwähnt, wie über dieses für das trimmen der nachgestellte Nullen ?
InformationsquelleAutor vortal