Benutzer-Werkzeuge

Webseiten-Werkzeuge


dateiformat

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
dateiformat [05.04.2015 23:13]
martin
dateiformat [11.08.2021 10:15] (aktuell)
Zeile 27: Zeile 27:
 </code> </code>
  
-Für Bücher ohne Skripte entfällt die Zeile+Für Bücher ohne Skript-Datei entfällt die Zeile
 <code> <code>
 ScriptMD5: <MD5 Summe der src-Datei> ScriptMD5: <MD5 Summe der src-Datei>
 </code> </code>
 +Ein Buch ohne Skript-Datei bedeutet nicht, dass das Buch keine Skripte enthält. Die binären Skripte befinden
 +ich immer noch einmal (ohne Kommentare) in der ouf-Datei.
 +
  
 Beispiel: ''txt''-Datei für das Buch mit der Buch-ID ''05045'' (Bauernhof Rätsel): Beispiel: ''txt''-Datei für das Buch mit der Buch-ID ''05045'' (Bauernhof Rätsel):
Zeile 47: Zeile 50:
 ====== Die png Datei ====== ====== Die png Datei ======
  
-Ein png-Bild der Größe 140px × 193px(???)+Ein png-Bild mit der Breite 140 Pixel. Die Höhe beträgt maximal 193 Pixel.
  
 ====== Die ouf Datei ====== ====== Die ouf Datei ======
Zeile 57: Zeile 60:
 | Index-Tabelle | n x 12 byte = n x 3 x 32 bit | | Index-Tabelle | n x 12 byte = n x 3 x 32 bit |
 | Padding || | Padding ||
-| MP3 / Binärscode ||+| MP3 (incl. optionalem ID3-Tag ) Binärcode ||
 | Padding || | Padding ||
-| MP3 / Binärscode ||+| MP3 (incl. optionalem ID3-Tag ) Binärcode ||
 | ... || | ... ||
-| MP3 / Binärscode ||+| MP3 (incl. optionalem ID3-Tag ) Binärcode ||
  
  
 ===== Dateikopf ===== ===== Dateikopf =====
  
-| 0 | Startposition der Index-Tabelle | 0x0068 | +| 0 (0x00) | Startposition der Index-Tabelle | 0x0068 | 
-| 4 | unbekannt | 2 | +| 4 (0x04) | unbekannt | 2 | 
-| 8 | erste Ting-ID | 15001 (15000 gefunden; laut "Doku" aber fehlerhaft) | +| 8 (0x08) | erste Ting-ID | 15001 (15000 gefunden; laut "Doku" aber fehlerhaft) | 
-| 12 | letzte Ting-ID | +| 12 (0x0c) | letzte Ting-ID | 
-| 16 | Anzahl der genutzten Ting-IDs | Entspricht nicht immer letzte Ting-ID – erste Ting-ID + 1 (???) +| 16 (0x10) | Anzahl der genutzten Ting-IDs | ''"letzte Ting-ID– "erste Ting-ID+ 1'' 
-| 20 | Buch-ID || +| 20 (0x14) | Buch-ID || 
-| 24 | unbekannt | Werte im Bereich 1 bis 20 gefunden (häufig gefunden: 2, 5, 7 und 11) | +| 24 (0x18) | unbekannt | Werte im Bereich 1 bis 20 gefunden (häufig gefunden: 2, 5, 7 und 11) | 
-| 28 | Erstellungszeitpunkt (???) | UNIX-Timestamp | +| 28 (0x1c| Erstellungszeitpunkt | UNIX-Timestamp | 
-| 32 | unbekannt | 0 | +| 32 (0x20) | unbekannt | 0 | 
-| 36 | unbekannt | 0x0000ffff |+| 36 (0x24) | unbekannt | 0x0000ffff |
  
 ===== Index-Tabelle ===== ===== Index-Tabelle =====
Zeile 86: Zeile 89:
 | 8 | 1 | MP3 | | 8 | 1 | MP3 |
 | 8 | 2 | Skript | | 8 | 2 | Skript |
 +
 +===== Padding =====
 +
 +Die einzelnen Einträge (MP3 oder Binärcode) fangen immer an einer Adresse ''X'' an, mit ''(X mod 0x200) == 0''. Das Padding erfolgt mit beliebigen Zeichen (meist nullen).
 +
 +===== Funktionen =====
  
 Bei einigen Büchern muss zu der Funktion ''getPositionInFileFromCode'' immer noch ein konstanter Wert hinzuaddiert werden. Dieser Wert kann bestimmt werden in dem man Bei einigen Büchern muss zu der Funktion ''getPositionInFileFromCode'' immer noch ein konstanter Wert hinzuaddiert werden. Dieser Wert kann bestimmt werden in dem man
Zeile 96: Zeile 105:
  
 <code> <code>
 +
 +
 +private static int getNextAddress(int x) {
 +  x += 0x100 - (x & 0xff);
 +    while(x % 0x200 != 0) {
 +      x += 0x100;
 +    }
 +  return(x);
 +}
 +
 pos = 12 * <Anzahl der Eintrage im Index> + <Startposition der Indextabelle> pos = 12 * <Anzahl der Eintrage im Index> + <Startposition der Indextabelle>
-pos += (0x100 - (pos % 0x100)% 0x100 +pos = getNextAddress(12 * <Anzahl der Einträge im Index> + <Startposition der Indextabelle>); 
-while(<Die 12 (???Bytes an der Stelle pos sind 0>) { +while(!isMp3(<daten ab pos>&& !isScript(<daten ab pos>)) { 
- pos += 0x100;+ pos += 0x200;
 } }
 </code> </code>
Zeile 110: Zeile 129:
 <code> <code>
  
-     private final static int[] E = { 578, 562, 546, 530, 514, 498, 482, 466, +private final static int[] E = { 578, 562, 546, 530, 514, 498, 482, 466, 
-                                     322, 306, 290, 274, 258, 242, 226, 210, -446, +                                 322, 306, 290, 274, 258, 242, 226, 210, -446, 
-                                     -462, -478, -494, -510, -526, -542, -558, -702, +                                 -462, -478, -494, -510, -526, -542, -558, -702, 
-                                     -718, -734, -750, -766, -782, -798, -814}; +                                 -718, -734, -750, -766, -782, -798, -814}; 
-    /** +/** 
-     * Errechnet aus der Position in der ouf-Datei und der Position in der Indextablelle + * Errechnet aus der Position in der ouf-Datei und der Position in der Indextablelle 
-     * den Positionscode in der Indextabelle + * den Positionscode in der Indextabelle 
-     * @param position Position in der Datei + * @param position Position in der Datei 
-     * @param n Position in der Indextablelle (startet bei 0) + * @param n Position in der Indextablelle (startet bei 0) 
-     * @return Positionscode in der Indextabelle (1. Feld). Im Fehlerfall -1 + * @return Positionscode in der Indextabelle (1. Feld). Im Fehlerfall -1 
-     */ + */ 
-     private static int getCodeFromPositionInFile(int position, int n) { +private static int getCodeFromPositionInFile(int position, int n) { 
-          if(((position & 0xFF) != 0x0) | (n < 0)) { +  if(((position & 0xFF) != 0x0) | (n < 0)) { 
-               return(-1)+    return -1; 
-          +  
-          n--; +  n--; 
-          int b = (position >> 8) + n * 0x1A; +  int b = (position >> 8) + n * 0x1A; 
-          for(int k = 0; k < E.length; k++) { +  for(int k = 0; k < E.length; k++) { 
-               int v = (b - E[k]) << 8; +    int v = (b - E[k]) << 8; 
-               if(getPositionInFileFromCode(v, n + 1) == position) { +    if(getPositionInFileFromCode(v, n + 1) == position) { 
-                    return(v)+      return v; 
-               +    
-          +  
-          return(-1)+  return -1; 
-     }+}
  
-    /** +/** 
-     * Errechnet aus dem Positionscode in der Indextabelle und der Position in der Indextablelle + * Errechnet aus dem Positionscode in der Indextabelle und der Position in der Indextablelle 
-     * die Position in der ouf-Datei + * die Position in der ouf-Datei 
-     * @param code Positionscode in der Indextabelle (1. Feld) + * @param code Positionscode in der Indextabelle (1. Feld) 
-     * @param n Position in der Indextablelle (startet bei 0) + * @param n Position in der Indextablelle (startet bei 0) 
-     * @return Position in der Datei. Im Fehlerfall -1 + * @return Position in der Datei. Im Fehlerfall -1 
-     */ + */ 
-     public static int getPositionInFileFromCode(int code, int n) { +public static int getPositionInFileFromCode(int code, int n) { 
-          if(((code & 0xFF) != 0x0) | (n < 0)) { +  if(((code & 0xFF) != 0x0) | (n < 0)) { 
-               return(-1)+    return -1; 
-          +  
-          n--; +  n--; 
-          code = code >> 8; +  code = code >> 8; 
-          int c = ((code >> 3) & 0x1) | (((code >> 4) & 0x1) << 1) | +  int c = ((code >> 3) & 0x1) | (((code >> 4) & 0x1) << 1) | 
-                  (((code >> 5) & 0x1) << 2) | (((code >> 7) & 0x1) << 3) | +          (((code >> 5) & 0x1) << 2) | (((code >> 7) & 0x1) << 3) | 
-                  (((code >> 9) & 0x1) << 4); +          (((code >> 9) & 0x1) << 4); 
-          code -= n * 0x1A - E[c]; +  code -= n * 0x1A - E[c]; 
-          return(code << 8)+  return code << 8; 
-     }+}
 </code> </code>
 +
dateiformat.1428275626.txt.gz · Zuletzt geändert: 11.08.2021 10:15 (Externe Bearbeitung)