AGB  ·  Datenschutz  ·  Impressum  







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

Binäre Datenspeicherung

Ein Thema von Cubysoft · begonnen am 7. Jun 2015 · letzter Beitrag vom 8. Jun 2015
Antwort Antwort
Seite 1 von 2  1 2      
Cubysoft

Registriert seit: 5. Sep 2014
Ort: Ludwigshafen
76 Beiträge
 
Delphi XE8 Professional
 
#1

Binäre Datenspeicherung

  Alt 7. Jun 2015, 01:35
Hey,

ich benutze derzeit ein Textformat, um meine Programmdaten zu speichern:

Code:
1;de //<-- Header
1;Sample;2563;3453;2143;20.3.1997;12.12.2010
2;TollerName;2343;2353;2342;20.5.2010;21.5.2010
.....
Natürlich hat das Speichern in Textform auch Nachteile. Die Daten liegen folgendermaßen vor:

Header:

Record:
- Version (Integer)
- Sprache (String, feste Länge)

Jede darauf folgende Zeile ist von einem Record Typ, dieser beinhaltet Integer, Strings (einen mit variabler, Rest mit fester Länge) und TDate. Diese Records sind alle in einer TList<TMyRecord>.

Ich kenne mich mit dem Speichern und Auslesen von binären Daten leider garnicht aus. Ich habe damals mal eine Liste mit Records (ohne Strings) ganz einfach binär abspeichern können, da ich allerdings diesmal einen String mit variabler Länge enthalten habe, komme ich nicht weiter. Ich weiß, dass es geht, nur nicht wie. Ich wäre euch wirklich dankbar, wenn ihr mir einen kleinen Beispielcode geben könntet für das schreiben und lesen binärer Informationen. Ihr könnt euch hierbei gerne an ein kompakteres Record wenden:

Delphi-Quellcode:
type
TMyRecord=record
 text: String;
 zahl: Integer;
 datum: TDate;
end;

//Das ganze dann in einer TList<TMyRecord>
Ich will hier nur nocheinmal klar machen, dass ich NICHT das Programm von euch geschrieben haben möchte (das kann man denke ich an meinen früheren Posts erkennen). Ich suche nur schon seit Stunden im Internet nach Lösungen und stolpere immer wieder über Codes, die ich nicht verstehe. Theoretisch müsste das ja mit einem MemoryStream gehn. Ich weiß leider nur überhauptnicht wie...
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 02:14
Google: delphi record speichern

Dann zeig uns doch mal den Code, den du nicht verstehst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 02:42
Und um es kurz zu machen, einen Record mit einem LongString (String, AnsiString, UnicodeString), WideString oder einem dyn. Array speichert man niemals "direkt" binär, aber das sollte auch in jedem ordentlichen Tutorial erwähnt werden.
der Typ String[123] = ShortString
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Jun 2015 um 03:02 Uhr)
  Mit Zitat antworten Zitat
Cubysoft

Registriert seit: 5. Sep 2014
Ort: Ludwigshafen
76 Beiträge
 
Delphi XE8 Professional
 
#4

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 03:12
Hey,

danke für eure Antworten. Das was ihr vorgeschlagen habt, kenne ich schon bereits und kann es so auch umsetzen, allerdings gibt es hierbei ein Problem: Ich will nicht immer ein 123 Zeichen großes Char-Array schreiben, weil der String manchmal (meitens) deutlich kleiner ist. Einer der Gründe, warum ich die Datei binär speichern möchte, ist der Platzverbrauch. Die Variante, die Tipps, die ich dazu bis jetzt gehört habe, haben vorgeschlagen, dass man einfach die Größe des Strings vor dem Datum (variabler String) schreibt.

Trotzdem kann ich das wie gesagt nicht umsetzen.. und Code kann ich euch logischerweise nicht zeigen, da ich noch keinen habe, der mein Problem löst. Ich habe derzeit einfach ein kleines "Test-Projekt" offen, und dort habe ich festgestellt, dass das eben bei variablen Strings nicht so einfach ist..
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 04:35
Naja so schwer ists auch wider nicht. Für dynamische Daten musst du extra Information speichern: Länge/Größe - damit weißt du dann beim Auslesen, wie viel/lang zu lesen ist.. Und String (AnsiString) ist ein dynamischer Typ- die Länge ist nicht konstant.

Dh aus String wird:
<Länge des Strings> <String>

Aus bel. dyn. Array wird:
<Länge des Arrays><Array>

Wobei das Speichern der Elemente des Arrays wieder rekursiv gleich behandelt werden muss - dh, wenn es z.B. ein String ist (also Array of String), muss für jedes Element die Länge mitgespeicher werden.. würde beispielsweise für dieses Array[2] {"Hallo", "Welt"} so aussehen:
<Länge: "2"> <Länge: "5"> <"Hallo"> <Länge: "4"> <"Welt">

Wie viel Speicher du für die Längenangabe belegen willst, musst du für dich selbst entscheiden (1 [Byte], 2 [Word], 4 [DWord] oder 8 Bytes [LongLong/Double?]). Ein Tipp: Wenn die Länge der Variable < 2^(x*8) ist, dann wähle x als Datentyp.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 09:11
Die Variante, die Tipps, die ich dazu bis jetzt gehört habe, haben vorgeschlagen, dass man einfach die Größe des Strings vor dem Datum (variabler String) schreibt.
Delphi-Quellcode:
type
 f=tstream;
 s=ansistring;
begin
  f:=tstream.create(myfile);
  f.write(length(s),sizeof(length(s));
  f.write(s[1],sizeof(ansichar)*length(s));
  f.free;
end;
Ich hab z.Zt. kein Delphi verfügbar, darum müßtest Du die Details noch überprüfen, aber das Prinzip sollte klar sein. Das Auslesen funktioniert entsprechend, erst die Länge lesen, dann die eigentlichen Daten.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 09:26
Wenn binär, dann verwende einfach TReader/TWriter.
Hat auch den Vorteil, daß der Aufbau der Datei in der Datei selber gleich mit enthalten ist und vorallem sind da schon viele typsichere Methoden zum Speichern und Lesen enthalten.

PS: Die DFMs im Binärformat (so wie früher in der *.DFM und heute immernoch in der Ressource gespeichert) benutzt das seit sehr, sehr, sehr vielen Jahren, ohne Probleme.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 11:25
PS: Die DFMs im Binärformat (so wie früher in der *.DFM und heute immernoch in der Ressource gespeichert) benutzt das seit sehr, sehr, sehr vielen Jahren, ohne Probleme.
Ohne Probleme? Ich erinnere mich aber noch ganz deutlich an Probleme aus der Zeit, als man die noch nicht als Text abspeichern und ggf. editieren konnte. Ich musste teilweise Formulare komplett neu erstellen, weil Delphi sie nicht mehr lesen wollte/konnte. OK, das war AFAIR Delphi 4 und aelter.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 11:30
Einer der Gründe, warum ich die Datei binär speichern möchte, ist der Platzverbrauch.
OK... Dann schreibe doch die 123 Byte langen Strings in einen gepackten Stream... und schon sind die Leerzeichen/Nullen egal.

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Binäre Datenspeicherung

  Alt 7. Jun 2015, 12:30
Die Binärvariante sollte mit #0 klarkommen, da dort die Strings ausschließlich über das Längenbyte/Längenword verwaltet werden,
aber sobald hier noch eine Umwandlung von/zur Textdarstellung vorkomt, dann war's das damit.

Aber "binär"-Daten in Strings sind eh ein bissl fahrlässig.

Da die DFMs im Delphi ausschließlich binär verarbeitet werden und somit die Textversion beim Einlesen erstmal umgewandelt wird, gibt es faktisch mehr Probleme mit Text, als mit binär.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Jun 2015 um 12:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:25 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