![]() |
Delphi-Version: 7
String mit 0 Bytes als Datei Speichern
Ich habe einen String in dem sich 0-Bytes befinden.
Ich wollte den Inhalt in eine Datei speichern und es verwundert mich dass diese weg nicht funktioniert:
Delphi-Quellcode:
Ich dachte dass in myStringList.Text auch binäre Daten sein können,
myStringList.Text := myString;
myStringList.SaveToFile('c:\myfile'); aber nach der Zuweisung (ohne Exception) ist myStringList.Text einfach leer. Was mache ich falsch? Wie speichere ich es sonst? |
AW: String mit 0 Bytes als Datei Speichern
Also eigentlich sollte das gehen. Aber jetzt kommt das Aber. Ohne auszuprobieren, ein Ansistring, das ist der 8-Bit String, ist meiner Kenntnis nach Nullterminiert. Die erste binäre Null (als Zahl = $00) im String ist somit das Ende der Datei.
Das Ganze sollte also klappen solange keine Null im Spiel ist. //Edit Fällt mir ein, Array of Char, bzw. AnsiChar, in Kombination mit TFileStream, sollte evtl. gehen. Evtl. Array of Byte. |
AW: String mit 0 Bytes als Datei Speichern
Zitat:
Zum Beispiel funktioniert das ( ![]()
Delphi-Quellcode:
var
s: string; begin s := 'experts-exchange'+ #0 + 'is great'; while (pos(#0, s) > 0) do s[pos(#0, s)] := ' '; ShowMessage(s); end; |
AW: String mit 0 Bytes als Datei Speichern
Natürlich, ich wollte auch etwas anderes ausdrücken. Vielmehr wollte ich sagen, dass das wackelig sein kann. Je nachdem wie der Verarbeitungsweg ist, kann an der Stelle der String angeschnitten werden.
Delphi-Quellcode:
var
a: String; begin a := 'In diesem Satz ist ' + #0 + 'ein Nullzeichen in der Mitte'; ShowMessage('String a hat die Länge: ' + IntToStr(Length(a))); Self.Caption := a; ShowMessage('Caption hat die Länge: ' + IntToStr(Length(Self.Caption))); end; |
AW: String mit 0 Bytes als Datei Speichern
![]() Kein Problem, aber vorher Bescheid geben ("Habe die Frage auch in diesem <Link> Forum gestellt") |
AW: String mit 0 Bytes als Datei Speichern
Willst Du nur einen Leerstring speichern oder
ein myStringList.Text Feld? MfG, terence PS: Speichert nun einen LeerString mit fester Größe ab!
Delphi-Quellcode:
var F : File; meinString : string[255]; ... meinString:=Trim(myString); AssignFile(F, 'c:\myfile.bin'); ReWrite(F, 1); BlockWrite(F, meinString, SizeOf(meinString)); CloseFile(F); |
AW: String mit 0 Bytes als Datei Speichern
Moin Shark,
um strings auch in C-Funktionen als PChar nutzen zu können, wird #00 bei entsprechenden Operationen auch als Ende eines Strings verarbeitet. Um einen String der binäre Nullen enthält speichern zu können, solltest Du TFileStream benutzen:
Delphi-Quellcode:
var
fs : TFileStream; myString : string; begin myString := StringOfChar(#00,5); fs := TFileStream.Create(<Pfad zur Datei>,fmCreate); try fs.Write(myString[1],Length(myString)); finally fs.Free; end; end; |
AW: String mit 0 Bytes als Datei Speichern
Es würde mich rein technisch interessieren, wieso ein String mit dem Inhalt #0#65 nicht zu StringList.Text zugewiesen werden kann. Da StringList.Text ja auch ein Delphi String ist, sollte doch #0 als Inhalt möglich sein.
|
AW: String mit 0 Bytes als Datei Speichern
Das ist die Prozedur die aufgerufen wird wenn ein String eine TStrings.Text zugeweisen wird:
Delphi-Quellcode:
//Edit
procedure TStrings.SetTextStr(const Value: string);
var P, Start: PChar; S: string; begin BeginUpdate; try Clear; P := Pointer(Value); if P <> nil then while P^ <> #0 do begin Start := P; while not (P^ in [#0, #10, #13]) do Inc(P); SetString(S, Start, P - Start); Add(S); if P^ = #13 then Inc(P); if P^ = #10 then Inc(P); end; finally EndUpdate; end; end; Evtl. eine Deutung: bei #0 ist Schluß mit String, da steigt die Routine raus. |
AW: String mit 0 Bytes als Datei Speichern
Wieso heißt das wohl "nullterminierter String"?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 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