hi Martin,
Dieser Header enthält Redundanzen. Um Position und Länge eines key- oder value-Eintrags zu bekommen, musst du zwei DWORDs lesen....
Die Redundanzen sind ok, das vereinfacht sowohl das Schreiben als auch das Lesen einer solchen Datei. Ich habe das gestern soweit fertiggebracht, dass Arrays of Arrays serializiert in Dateien abgespeichert werden können. In Perl sieht das in Etwa so aus:
['url', 'descr', 'title', 'lastmod', 'folder'] # ein Objekt (Record)
Anstelle DWORD ists bei mir ein short, das sind dann nur 2 byte je Integer (16 Bit, ermöglicht 65536 Einträge, reicht dicke). Der Dateiheader sieht so aus (hier mit Zeilenumbruch aufgezeigt, in der Datei selbst sind die Bits hintereinander weggeschrieben):
2 byte: Anzahl der Einträge
2 byte: Anzahl der Eigenschaften eines Objekts (lt. o.g. Beispiel 5 Datenfelder)
Je Eintrag gibt es dann einen header, der geht so:
2 byte: Position
2 byte: Länge
usw., also 4 byte je Datenfeld.
Die binary steht dann hintendran.
Zum Lesen der Datei wird nur der Index (header) solange im Speicher gehalten, wie das Script am Leben ist. Aus Performgründen werden die Aufgaben auf verschiedene Funktionen verteilt, je nach Verwendungszweck wird dann entweder nur ein Objekt ausgelesen oder auch mal das komplette Array. Auch zum Lesen des headers (index) gibt es eine extra Funktion, die liest nur den Dateiheader, wie weit diese Funktion lesen muss, steht praktisch in den ersten 4 bytes.
Derzeit ist ein Record nur per Index [0], [1] usw. adressierbar, auch die Datenfelder. Ich lasse mir noch was einfallen, was eine namentliche Adressierung ermöglicht. Mehr geht im Moment nicht aber das ist schonmal ne ganze Menge ;-)
viele Grüße,
Horst Pfeifenraucher