AGB  ·  Datenschutz  ·  Impressum  







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

Records/Typen erkennen

Ein Thema von TheMiller · begonnen am 2. Mai 2012 · letzter Beitrag vom 4. Mai 2012
Antwort Antwort
Furtbichler
(Gast)

n/a Beiträge
 
#1

AW: Records/Typen erkennen

  Alt 3. Mai 2012, 07:07
Wieso verwendest Du kein Datenformat, wie z.B. JSON?

Mit den Versionsnummern wird die Leseroutine sehr schnell sehr unübersichtlich, aber es funktioniert.
Delphi-Quellcode:
Procedure TMyClass.ReadFromStream(aVersion : Integer; aStream : TStream);
Begin
  Name := ReadString(aStream);
  LastName := ReadString(aStream);
  if aVersion>1020 then begin
    Middle := ReadString(aStream);
    If aVersion>1030 then
      birthday := ReadDate(aStream);
    ...
  end;
...
end;

Geändert von Furtbichler ( 3. Mai 2012 um 07:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#2

AW: Records/Typen erkennen

  Alt 3. Mai 2012, 13:20
Hallo,

meine Dateien werden im Regelfall recht klein (ca. 100 kb). Vereinzelt kann mal eine mehrere MB, nicht aber hunderte von MBs oder gar GBs erreichen.

Ich brauche nur die Information, was es für eine Datei ist und welche Version sie hat. Ich denke, dann baue ich einfach zwei Header. Einen, der nur Version und Dateityp beinhaltet, der zweite Header gibt dann die Infos für die Strings.

Mit diesen Dateien wird sowieso recht selten gearbeitet. Es ist nur ein "Zusatz" zur Datenbank.

Den Header ans Ende der Datei schreiben finde ich irgendwie nicht so sauber, oder? Heißt ja header, nicht footer

Danke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#3

AW: Records/Typen erkennen

  Alt 3. Mai 2012, 13:50
Delphi-Quellcode:
type
  TVersionFileHeader =
    Signatur: array[1..4] of AnsiChar;
    Version: Word;
  end;

  TFileHeaderXyzV1 =
    Version: TVersionFileHeader;
    A: Byte;
    B: Word;
    ... weitere Felder für V1
  end;

  TFileHeaderXyzV2 =
    Version: TVersionFileHeader;
    C: LongWord;
    D: Word;
    ... weitere Felder für V2
  end;
Wenn die Header möglichst jeweils gleich groß sind, dann könnte man auch ... (mir fällt grade der Name nicht ein)

Delphi-Quellcode:
type
  TMyFileHeader =
    Signatur: array[1..4] of AnsiChar;
    Version: Word;
    case Integer of
      0: (A: Byte;
          B: Word;
          ... weitere Felder für V1);
      2: (C: LongWord;
          D: Word;
          ... weitere Felder für V2);
  end;
Alternativ könnte man sich auch einen Header ala TReader/TWriter aufbauen, welcher deinen Aufbau gleich mitbringt (quasi wie eine binäre XML).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Records/Typen erkennen

  Alt 3. Mai 2012, 14:06
Ich benutze gern magische Zahlen am Dateibeginn, Abschnittsbeginn und Dateiende.
Die Zahlen am Dateibeginn (z.B. mal zufällig $38 $94 $F3 $21 oder so) versichern der Leseroutine, dass es sich tatsächlich um den erwarteten Dateityp (und -version) handelt. Jede neue Version bekommt leicht abgewandelte Zahlen und jeder neue Dateityp sowieso komplett andere.
Die Zahlen am Abschnittsbeginn versichern der Leseroutine, dass der Zeiger im Header auch richtig stand. Zudem kann man dadurch auch einzelne Abschnittstypen besser versionieren. Änderst du z.B. nur eine Recorddefinition, dann brauchst du auch nur eine neue Version dieses Abschnitttyps, und nicht des ganzen Dateityps.
Die Zahlen am Dateiende zeigen an, dass die Datei vollständig ist, und nicht irgendwo abgeschnitten. Zudem könnte man danach/davor noch eine Prüfsumme anbringen (die könnte aber theoretisch auch einfach in den Header...).
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

AW: Records/Typen erkennen

  Alt 4. Mai 2012, 08:36
Moin!

Das mit der Prüfsumme ist eine gute Idee, zumal meine Daten auch über USB und WAN übertragen werden sollen. Das mit den Zufallszahlen ist okay, ich würde aber wegen besonderen Gegebenheiten doch lieber die Version mit den zwei Headern verwenden, also so wie es himitsu geschrieben hast. So war eigentlich auch meine Ursprungsidee.

Danke
  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 01:37 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