Difference between revisions of "Zeno file format"

Jump to navigation Jump to search
696 bytes added ,  18:22, 11 January 2013
m
(5 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{Box|'''Please note:''' This page only exists for historical reasons, therefore it has not been translated to English.
The Zeno file format has been obsoleted by the ZIM (Zeno IMproved) file format. The ZIM library is not compatible to Zeno anymore as there are major differences between Zeno and ZIM concerning features and compression. Zeno was never widespread and is not used anymore.
The successor of Zeno is the [[ZIM File Format]] which is used in many [[ZIM Readers|reader applications on different platforms]] and offers an easy to use [[zimlib]].}}
Documentation by Erwin Jurschitza (DirectMedia Verlagsgesellschaft Berlin, http://www.directmedia.de/).
= ZenoReader/Library =
= ZenoReader/Library =
Die Dokumentation wurde für das Zeno-2.0-Format aktualisiert!  
Die Dokumentation wurde für das Zeno-2.0-Format aktualisiert!  
Line 30: Line 38:
=== Inhaltsverzeichnis ===
=== Inhaltsverzeichnis ===
Um den Code erstmal einfach zu halten, wird das ganze Inhaltsverzeichnis auf einen Schlag eingelesen (kann mit dem Parameter /f erzwungen werden, bringt Geschwindigkeitsgewinn auf Kosten von RAM).  
Um den Code erstmal einfach zu halten, wird das ganze Inhaltsverzeichnis auf einen Schlag eingelesen (kann mit dem Parameter /f erzwungen werden, bringt Geschwindigkeitsgewinn auf Kosten von RAM).  
<pre>
  TWPVLibrary = class (TObject)
  TWPVLibrary = class (TObject)
  private
  private
   FBuffer: array of byte;  // das Inhaltsverzeichnis als Byte-Stream mit Records variabler Länge
   FBuffer: array of byte;  // das Inhaltsverzeichnis als Byte-Stream mit Records variabler Länge
   FBufferSize: integer;
   FBufferSize: integer;
</pre>


Auf jeden Fall ganz eingelesen werden muss die Zeigerliste auf das Inhaltsverzeichnis. Sie wird in einer Listenstruktur gehalten, könnte aber auch ein array of integer sein. Die Liste ist vorsortiert, siehe ZenoReader/Qunicode.  
Auf jeden Fall ganz eingelesen werden muss die Zeigerliste auf das Inhaltsverzeichnis. Sie wird in einer Listenstruktur gehalten, könnte aber auch ein array of integer sein. Die Liste ist vorsortiert, siehe ZenoReader/Qunicode.  
<pre>
   FList: TList;             
   FList: TList;             
</pre>


Beispiel: Das nullte Element der Liste hat den Wert 0 und zeigt auf Nullte Byte in FBuffer. Das erste Element hat z.B. den Wert 56 und zeigt auf das 56. Byte in FBuffer, was einem Zeiger auf den zweiten Eintrag des Inhaltsverzeichnisses entspricht, usw. Dabei ist der Inhalt von FBuffer folgendermaßen zu interpretieren:  
Beispiel: Das nullte Element der Liste hat den Wert 0 und zeigt auf Nullte Byte in FBuffer. Das erste Element hat z.B. den Wert 56 und zeigt auf das 56. Byte in FBuffer, was einem Zeiger auf den zweiten Eintrag des Inhaltsverzeichnisses entspricht, usw. Dabei ist der Inhalt von FBuffer folgendermaßen zu interpretieren:  
<pre>
  TZenoLibraryCompressionType = (zenocompDefault, zenocompNone, zenocompZip);
  TZenoLibraryCompressionType = (zenocompDefault, zenocompNone, zenocompZip);
  TZenoLibraryMimeType = (ZenomimeTextHtml, ZenomimeTextPlain, ZenomimeImageJpeg, ZenoMimeImagePng,  
  TZenoLibraryMimeType = (ZenomimeTextHtml, ZenomimeTextPlain, ZenomimeImageJpeg, ZenoMimeImagePng,  
Line 56: Line 72:
   rExtra: array [0..$FFF] of char;            // Artikeltitel, Nullbyte, evtl. Parameter wie h=200, durch Nullbyte getrennt
   rExtra: array [0..$FFF] of char;            // Artikeltitel, Nullbyte, evtl. Parameter wie h=200, durch Nullbyte getrennt
  end;
  end;
</pre>


Es ist zu beachten, dass der Record auf Bytegrenzen gepackt ist, d.h. ohne rExtra genau 26 Byte groß ist. Durch das zwingene Nullbyte in rExtra auch bei einem leeren Artikeltitel ist somit jeder Eintrag mindestens 27 Byte groß.  
Es ist zu beachten, dass der Record auf Bytegrenzen gepackt ist, d.h. ohne rExtra genau 26 Byte groß ist. Durch das zwingene Nullbyte in rExtra auch bei einem leeren Artikeltitel ist somit jeder Eintrag mindestens 27 Byte groß.


=== Zusatzdaten bei Indexdateien ===
=== Zusatzdaten bei Indexdateien ===
Line 69: Line 86:
Ein Eintrag für V und W ist ein 4-Byte-Integer (Artikelindex), ein Eintrag für X ein 8-Byte-Integer (Artikelindex und Wortindex).  
Ein Eintrag für V und W ist ein 4-Byte-Integer (Artikelindex), ein Eintrag für X ein 8-Byte-Integer (Artikelindex und Wortindex).  
Nach dem abschließenden Nullbyte des Wortes in rExtra kommt ein Längenbyte für die nachfolgende Struktur, das stets <= 255 ist. Alle Integers sind komprimiert, siehe unten.  
Nach dem abschließenden Nullbyte des Wortes in rExtra kommt ein Längenbyte für die nachfolgende Struktur, das stets <= 255 ist. Alle Integers sind komprimiert, siehe unten.  
flags: die ersten vier Bit geben an, ob es einen Eintrag für die Gewichtung (0..3) gibt,
      auch dieses Byte ist (unnötigerweise) schon komprimiert, d.h. in komprimiertem
      Zustand sind die Bits um 2 nach links verschoben.


* flags: die ersten vier Bit geben an, ob es einen Eintrag für die Gewichtung (0..3) gibt, auch dieses Byte ist (unnötigerweise) schon komprimiert, d.h. in komprimiertem Zustand sind die Bits um 2 nach links verschoben.


Für jede Gewichtung folgt ein Eintrag:  
Für jede Gewichtung folgt ein Eintrag:  
Line 79: Line 94:
* firstWordIndex: nur bei X
* firstWordIndex: nur bei X


Der erste Eintrag einer jeden Gewichtung befindet sich somit in RZenoArticle und ist schnell zu lesen. Gibt es nur diesen einen Eintrag, ist len=0, ansonsten gibt es weitere Einträge in der Indexdatei.  
Der erste Eintrag einer jeden Gewichtung befindet sich somit in RZenoArticle und ist schnell zu lesen. Gibt es nur diesen einen Eintrag, ist len=0, ansonsten gibt es weitere Einträge in der Indexdatei.


== NamespaceCounts-Tabelle ==
== NamespaceCounts-Tabelle ==

Navigation menu