AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String mit 0 Bytes als Datei Speichern

Ein Thema von Shark99 · begonnen am 27. Jan 2013 · letzter Beitrag vom 28. Jan 2013
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 01:58
Delphi-Version: 7
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?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 04:57
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.

Geändert von Popov (27. Jan 2013 um 05:23 Uhr)
  Mit Zitat antworten Zitat
evilboy

Registriert seit: 31. Jul 2004
Ort: Berlin
49 Beiträge
 
Delphi 2009 Enterprise
 
#3

AW: String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 05:40
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;
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 06:06
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;
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 08:45
Crosspost in SO
Kein Problem, aber vorher Bescheid geben ("Habe die Frage auch in diesem <Link> Forum gestellt")
  Mit Zitat antworten Zitat
terence14
(Gast)

n/a Beiträge
 
#6

AW: String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 09:44
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);

Geändert von terence14 (27. Jan 2013 um 09:48 Uhr)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 10:01
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#8

AW: String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 21:22
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: String mit 0 Bytes als Datei Speichern

  Alt 27. Jan 2013, 23:33
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.

Geändert von Popov (27. Jan 2013 um 23:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#10

AW: String mit 0 Bytes als Datei Speichern

  Alt 28. Jan 2013, 07:56
Wieso heißt das wohl "nullterminierter String"?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 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