![]() |
Stringende wieder hinzufügen
Hallo,
da diese Frage spezieller ist, eröffne ich einen neuen Thread, der aber eigentlich zu dem hier ( ![]() Also, ich habe in dem oben genannten Thread eine Funktion gepostet bekommen, mit der ich das Stringende-Zeichen #0 entfernen kann. Nun zeigt mir das Memo alles toll an. Damit ich die Datei wieder speichern kann, habe ich das #0 durch ?) ersetzt. Nun möchte ich das ?)-Zeichen wieder in #0 mit StrReplaceBin umwandeln. Doch da fügt er nur das erste Zeichen ein, erkennt natürlich wieder ein Stringende und hört somit auf. Somit habe ich nur die ersten 4 Bytes (?) glaube ich. Die Datei kann also nicht mehr gespeichert werden. Ich denke, dass StrReplaceBin müsste am Ende der Datei anfangen zu ersetzen und sich vorarbeiten, damit sie nicht vorzeitig abbricht. Doch die Funktion ist in ASM und davon habe ich noch weniger Ahnung. Bitte um Hilfe! Danke |
Re: Stringende wieder hinzufügen
Du kannst doch einfach den String mit einer for-Schleife durchlaufen und jedes Ersatzzeichen durch ein #0 ersetzen.
|
Re: Stringende wieder hinzufügen
Das darf doch dann aber kein String-#0 sein. Es muss ja ein Binärwert sein... Sonst habe ich ja #0 da stehen und nicht ein tatsächliches Stringende. Oder?
|
Re: Stringende wieder hinzufügen
Und welches Ersatzzeichen soll man da nehmen? Vielleicht ist ja z.B. das Fragezeichen vorher auch ein Fragezeichen gewesen und nicht #0 :zwinker:
|
Re: Stringende wieder hinzufügen
Ich will ja kein Ersatzzeichen, ich mag ja nur mein Ersatzzeichen wieder in ein Binär-#0-Zeichen umwandeln.
|
Re: Stringende wieder hinzufügen
#0 ist das Zeichen mit dem Binärwert 0, wird also bei PChars als Stringende interpretiert. Der Trick liegt darin, dass bei Strings im Gegensatz zu PChars noch eine zusätzliche Längenangabe vorliegt, auf die mit Length() zugegriffen wird. Damit umgehst du das Problem des vorzeitigen Abbrechens.
|
Re: Stringende wieder hinzufügen
Hm.. das hab ich nicht ganz verstanden.
Zuerst wandel ich den Kram folgendermaßen um, um ihn im Memo anzuzeigen:
Delphi-Quellcode:
Nun kann ich es im Memo alles ansehen. Um zu speichern, wollte ich wieder zurückwandeln:
//String, Suchen_nach, Ersetzen-durch
StrReplaceBin(s, #0, '&%');
Delphi-Quellcode:
Da ersetzt er nur bis zum ersten Vorkommen, danach ist für ihn der String zu Ende.
StrReplaceBin(s, '&%', #0);
Ich habe nicht ganz verstanden, wie dieser "Trick" funktionieren soll, den du geschrieben hast - bzw wie ich ihn umsetze. |
Re: Stringende wieder hinzufügen
Hm, mit einem Ersetzungsstring, der größer als ein Byte ist, wird das etwas schwieriger. Allerdings nicht unmöglich:
Delphi-Quellcode:
Ich habe es nicht getestet, aber zumindest mit Ansistrings müsste es so gehen.
procedure Fix0Bytes(var Str: String);
var i, j: Integer; begin i := 1; j := 1; while i < Length(Str) do if (Str[i] = '&') and (Str[i+1] = '%') then begin Str[j] := #0; Inc(i, 2); Inc(j); end else begin Str[j] := Str[i]; Inc(i); Inc(j); end; SetLength(Str, j); end; |
Re: Stringende wieder hinzufügen
Hey...
hab mal Copy&Paste gemacht, das Ergebnis ist leider das gleiche. Vielleicht müssen wir die Funktion so umschreiben, dass sie am Dateiende beginnt, die Strings zu ersetzen und sich zum Beginn der Datei vorarbeitet. Das könnte doch gehen, oder? |
Re: Stringende wieder hinzufügen
Wie speicherst du denn den String?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz