Wie konvertieren von string null-terminiert ist?
Gewusst wie: konvertieren eine einfache Zeichenfolge in einen null-terminierten?
Beispiel:
Beispiel-string: "Test-Nachricht"
Hier sind die bytes:
54 65 73 74 20 6D 65 73 73 61 67 65
Brauche ich string mit den bytes wie folgt:
54 00 65 00 73 00 74 00 20 00 6D 00 65 00 73 00 73 00 61 00 67 00 65 00 00
Könnte ich Schleifen, aber zu hässlichen code. Wie kann ich diese Konvertierung von nativen Methoden?
"string mit den bytes" ist ein non-sequitur. Ein string besteht aus Zeichen, nicht von bytes.
Ok. "- Zeichenfolge mit Zeichen mit hex-code wie diesen".
Ich glaube, dieser code ist zu hässlich:
Ich bin mir auch nicht sicher, dass tatsächlich das, was Sie wollen, obwohl. Ein string besteht aus UTF-16 code-Einheiten. Wenn Sie tatsächlich benötigen, senden eine kodierte form des Strings in bytes angezeigt, das ist eine andere Sache... Bitte mehr Kontext.
Ok. "- Zeichenfolge mit Zeichen mit hex-code wie diesen".
Ich glaube, dieser code ist zu hässlich:
Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(s + "\0"))
Oder nicht? Dieser code funktioniert einwandfrei.Ich bin mir auch nicht sicher, dass tatsächlich das, was Sie wollen, obwohl. Ein string besteht aus UTF-16 code-Einheiten. Wenn Sie tatsächlich benötigen, senden eine kodierte form des Strings in bytes angezeigt, das ist eine andere Sache... Bitte mehr Kontext.
InformationsquelleAutor user2264990 | 2013-04-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie Sie wollen eine null-terminierte Unicode-Zeichenfolge. Wenn der string in einer Variablen gespeichert ist
str
sollte diese Arbeit:(Sehen Sie es ausführen.)
Beachten Sie, dass das resultierende array mit drei null-bytes am Ende. Dies ist, weil Unicode stellt Zeichen mit zwei bytes. Die erste null ist die Hälfte von dem letzten Zeichen in der ursprünglichen Zeichenfolge, und die nächsten beiden sind, wie Unicode kodiert, die null-Zeichen
'\0'
. (In anderen Worten, es gibt eine zusätzliche null-Zeichen mit meinem code, als das, was Sie ursprünglich angegeben, aber das ist wahrscheinlich das, was Sie eigentlich wollen.)Sie fragte, für ein Byte. Strings in C# - Zeichen enthalten, nicht bytes. Bitte keine Verwechslungen Ihre Frage. Eine Erklärung von warum, die Sie brauchen, das wäre hilfreich.
Ich was code ist zu hässlich... oder nicht?- Codierung.Unicode.GetString(Kodierung.Unicode.GetBytes(s + "\0"))
Dass haben genau das gleiche Ergebnis, wie nur
(s + "\0")
. Die meisten der Zeit,Encoding.X.GetString(Encoding.X.GetBytes(s)) == s
für jede KodierungX
.Ja, das ist viel zu hässlich. Wenn Sie wollen einfach nur die Zeichenfolge, verwenden Sie einfach
s = s + "\0"
... aber nicht, dass das verschachteln der string mit Unicode-NUL-Zeichen, und ich vermute, Sie wollen nicht, dass die sowieso. Aber Sie brauchen, um mehr Kontext hier.InformationsquelleAutor cdhowie
Ein wenig hintergrund über die c# - strings ist ein guter Ort, um zu starten.
Die interne Struktur von C# - string unterscheidet sich von einem C-string.
a) Es ist unicode, wie ein 'char'
b) Es ist nicht null-terminiert
c) Es enthält viele utility-Funktionen, die in C/C++, die Sie verlangen würden.
Wie geht das Weg ohne null-Terminierung? Einfach! Intern wird ein C# - String verwaltet einen char-array. C# - arrays werden Strukturen, nicht der Zeiger (wie in C/C++). Als solche, Sie sind sich Ihrer eigenen Länge. Die Null-Terminierung in C/C++ erforderlich ist, damit die string-utility-Funktionen wie strcmp() in der Lage sind zu erkennen, die Ende des Strings im Speicher.
Dem null-Zeichen existiert in c#.
Dadurch erhalten Sie eine Zeichenfolge endet mit einem null-terminator. Wichtig ist, die null-Zeichen ist unsichtbar und wird nicht in jeder Ausgabe. Es wird sich zeigen, in der debug-Fenster. Es wird auch anwesend sein, wenn Sie konvertieren Sie die Zeichenfolge in ein byte-array (für das speichern auf die Festplatte und andere E /a-Operationen), aber wenn Sie
Console.WriteLine(content)
es wird nicht sichtbar sein.Sollten Sie verstehen, warum Sie wollen, dass null-terminator, und warum Sie möchten, um zu vermeiden, mit einem loop-Konstrukt zu bekommen, was Sie sind nach. Eine mit null beendete Zeichenfolge ist ziemlich nutzlos in c#, es sei denn, Sie sind am Ende der Konvertierung in ein byte-array. In der Regel werden Sie nur tun, wenn Sie möchten, senden Ihren Text an eine native-Methode, über ein Netzwerk oder auf einem usb-Gerät.
Es ist auch wichtig zu wissen, wie Sie bekommen Ihre bytes. In C/C++ ein char gespeichert wird als 1 Byte (8bit) und die Codierung ist ANSI. In C# die Codierung ist unicode, es ist zwei bytes (16 bit). Jon Skeet ist die Antwort zeigt Ihnen, wie man die bytes in unicode.
das ist ein guter Punkt. Ich würde mich immer gefragt, warum die Codierung.Getbytes beendet.
InformationsquelleAutor Gusdor
Zunge in der Wange, aber potenziell nützliche Antwort.
Wenn Sie nach der Ausgabe auf Ihrem Bildschirm in hex, wie Sie gezeigt haben, da Sie wollen, Folgen zwei Schritte:
Versuchen Sie dies:
Ausgabe:
InformationsquelleAutor Gusdor
Hier ein getestetes C# - Beispiel eines xml-Befehl null-terminiert und funktioniert Super.
InformationsquelleAutor dcarl661