"\0" in AnsiString schreiben
-
Hallo,
das Zeichen '\0' wird bei einem AnsiString ja als Stringende gewertet.
Nun habe ich das Problem, dass ich genau dieses Zeichen IN einen String schreiben will (danach kommen also noch weitere Zeichen).
Wenn man nun einfach sagt…AnsiString wort; … wort += "\0";… dann fügt er gar nichts hinzu.
Ich weiß, dass ich zuerst einen Backslash und danach eine 0 schreiben könnte, aber das sind ja dann zwei Zeichen. Ich brauche es aber so, dass es nur ein Zeichen ist.
Ich hoffe ihr versteht was ich meine
und habt eine Idee, ob / wie das möglich ist.Gruß
Junimond
-
M.E. nicht möglich
-
eventuell
"\\0"
-
wort += '\0';
-
1310-Logik schrieb:
eventuell
"\\0"
Hallo,
danke für den Tipp, aber dann wird es auch als zwei Zeichen gespeichert.
Vielleicht sollte ich mal kurz den Hintergrund erklären: Ich verschlüssele eine Datei mit dem AES-Algorithmus. In einem anderen Programm lese ich die Datei dann ein und entschlüssele sie.
Nun kommt es vor, dass in dem verschlüsselten String ein '\0' vorkommt. Wenn ich diese Zeichenkette dann versuche zu entschlüsseln, "fehlt" das \0, genau wie in dem Code-Beispiel, was ich geschrieben hatte (wird nicht hinzugefügt). Und dann funktioniert die Entschlüsselung nicht mehr.
Na ja, aber wenn das nicht geht, dann muss ich mir was anderes einfallen lassen.
Gruß
Junimond
-
Hallo
das geht nicht
AnsiString test = "Test"; test += "\0"; test += "Text"; Label1->Caption = test; Label2->Caption = IntToStr(test.Length());Ergebnis : "TestText", 8 Zeichen
AnsiString test = "Test"; test += '\0'; test += "Text"; Label1->Caption = test; Label2->Caption = IntToStr(test.Length());Ergebnis : "Test", 9 Zeichen
So oder so hat '\0' in AnsiStrings nichts zu suchen. Denn intern verwendet AnsiString C-Strings, und die sind Null-Terminiert.
Wenn du trotzdem den 0-Wert in einer Zeichenkette haben willst, must du STreams wie std::stringstream verwenden.
bis bald
akari
-
;;; schrieb:
wort += '\0';
Juhuu, das funktioniert!

Danke lieber Unregistrierter, du bist mein Held.

EDIT: @akari: hmm, ich verstehe was du meinst. aber mit "wort += '\0';" funktioniert meine Entschlüsselung, und darum gings mir ja.
-
Nun kommt es vor, dass in dem verschlüsselten String ein '\0' vorkommt. Wenn ich diese Zeichenkette dann versuche zu entschlüsseln, "fehlt" das \0, genau wie in dem Code-Beispiel, was ich geschrieben hatte (wird nicht hinzugefügt). Und dann funktioniert die Entschlüsselung nicht mehr.
Ist ja auch die falsche Vorgehensweise. Es handelt sich mitnichten um Strings. Vielmehr handelt es sich um Speicherbereiche. Die kann man nicht einfach als String ansehen
-
junimond schrieb:
;;; schrieb:
wort += '\0';
Juhuu, das funktioniert!

Danke lieber Unregistrierter, du bist mein Held.

Ähhh, trotz 2er Hinweise, dass das nicht geht???
Seltsam
-
Es geht doch. Das sieht man doch an akaris zweitem Beispiel. Der String ist 9 Zeichen lang, so wie es gewünscht ist. AnsiString orientiert sich eben nicht an der 0 Terminierung.
-
Hallo
es scheint soweit zu laufen, solange nur AnsiString verwendet wird. Spätestens aber bei verwenden von c_str() fehlt dann aber etwas.
Fakt ist das für solche Sachen Streams die richige Wahl sind.
bis bald
akari
-
Spätestens aber bei verwenden von c_str() fehlt dann aber etwas.
Auch das ist kein Problem wenn man sich noch die Länge des Strings merkt.
-
Ok, warten wir ab, wie lange junimond braucht, um festzustellen, dass es doch nicht so richtig funktioniert...
-
Auch das ist kein Problem wenn man sich noch die Länge des Strings merkt.
Wozu einfach, wenn es auch kompliziert geht und auch noch ein konzeptioneller Fehler vorliegt
-
Solche Strings braucht man manchmal für WinAPI Funktionen. Dort werden einzelne Teilstrings mit \0 terminiert und mit einem leeren Teil-String wird das Ende signalisiert.
-
a) sind das keine Strings, sondern chars (zur Erinnerung ein C/C++ Datentyp)
b) wurde doch darauf hingewiesen, dass String intern mit chars arbeitetDort werden einzelne Teilstrings mit \0 terminiert und mit einem leeren Teil-String wird das Ende signalisiert.
Was könnte ein leerer Teilstring sein??
Fakt ist, dass in chars ein \0 das Ende darstellt.
-
Christian411 schrieb:
Fakt ist, dass in chars ein \0 das Ende darstellt.
Und in AnsiStrings auch, wie akaris Beispiel zeigt. Keine VCL-Funktion wird den AnsiString weiter als bis zum \0 abarbeiten, egal welche Größe in AnsiString[0] angegeben wird. Ergo kann er nichts mit dem so modifizerten AnsiString machen.
Würde mich noch interessieren, welche WinAPI-Funktion(en) solche Strings erwarten.
-
Würde mich noch interessieren, welche WinAPI-Funktion(en) solche Strings erwarten.
Vermutlich ist hier doch ein Zeiger auf char gemeint?!?(AnsiString.c_str())
-
Hallo
Joe meint wohl diese Bemerkung
hin schrieb:
Solche Strings braucht man manchmal für WinAPI Funktionen. Dort werden einzelne Teilstrings mit \0 terminiert und mit einem leeren Teil-String wird das Ende signalisiert.
Kenne auch keine Funktion, die sowas erwartet. Denn ein char* array[] ist das jedenfalls nicht.
bis bald
akari
-
SHFILEOPSTRUCT für SHFileOperation erwartet solche Formate in pFrom bzw. pTo. AnsiString ist für sowas aber natürlich falsch. Ein normaler char* tuts hier am besten. Immer vorausgesetzt, dass man auf ein solches char-Array kein string-Funktionen anwendet (aus string.h).