Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String mit 0 Bytes als Datei Speichern (https://www.delphipraxis.net/172882-string-mit-0-bytes-als-datei-speichern.html)

Shark99 27. Jan 2013 00:58

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:
myStringList.Text := myString;
myStringList.SaveToFile('c:\myfile');
Ich dachte dass in myStringList.Text auch binäre Daten sein können,
aber nach der Zuweisung (ohne Exception) ist myStringList.Text einfach leer.

Was mache ich falsch? Wie speichere ich es sonst?

Popov 27. Jan 2013 03:57

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.

evilboy 27. Jan 2013 04:40

AW: String mit 0 Bytes als Datei Speichern
 
Zitat:

Zitat von Popov (Beitrag 1200793)
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.

Nicht ganz – ein AnsiString kann zumindest auch das speichern, was hinter einem #0 ist, anders als ein PChar.

Zum Beispiel funktioniert das (Quelle) sehr wohl:
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;

Popov 27. Jan 2013 05:06

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;

Furtbichler 27. Jan 2013 07:45

AW: String mit 0 Bytes als Datei Speichern
 
Crosspost in SO
Kein Problem, aber vorher Bescheid geben ("Habe die Frage auch in diesem <Link> Forum gestellt")

terence14 27. Jan 2013 08:44

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);

Christian Seehase 27. Jan 2013 09:01

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;

Shark99 27. Jan 2013 20:22

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.

Popov 27. Jan 2013 22:33

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:
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;
//Edit

Evtl. eine Deutung: bei #0 ist Schluß mit String, da steigt die Routine raus.

DeddyH 28. Jan 2013 06:56

AW: String mit 0 Bytes als Datei Speichern
 
Wieso heißt das wohl "nullterminierter String"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz