# Aufbau Btrieve-Format .DAT



## c4esar (10. Mai 2010)

Hi Leute,

ich beschäftige mich z.Zt. damit, den Inhalt alter (aus DOS-Zeiten) Btrieve .DAT Dateien (heute Pervasive) anzuzeigen.
Sie stammen anscheinend aus einer sehr frühen Zeit vor Version 6.0, als der Zugriff über die Btrieve.exe als TSR lief, und es handelt sich um Standard-Dateien, d.h. es liegt keine Aufteilung in Index- und Daten-Datei vor. .DDF-Dateien sind nicht vorhanden.

Die einzigen Dokumentationen, so man sie so nennen will, die ich gefunden habe, sind die von Wikipedia und die Hilfe-Dateien von Pervasive.
Beide Quellen sind nicht sonderlich aufschlussreich, was den genauen Aufbau der Pages anbelangt.
Bisher habe ich die folgenden Informationen gesammelt; dabei ist zu beachten, dass ein WORD jeweils als Little Endian gespeichert wird, d.h. Reihenfolge niederwertiges Byte - höherwertiges Byte (bei einem DWORD aber zuerst das höherwertige Bytepaar, dann das niederwertige Bytepaar):

*Alle Pages:*
Bytes 2 - 3: fortlaufende Nummer der Page

*Header:*
Bytes 8 - 9: Pagegröße der Datei
Bytes 20 - 21: Anzahl der Indizes (verbundene als 1 Index gezählt)
Bytes 22 - 23: Datensatzgröße in Bytes (ohne Adressierungen, Endzeichen etc.) 
Bytes 24 - 25: Datensatzgröße in Bytes (mit Adressierungen, Endzeichen etc.)
Bytes 26 - 31: Anzahl der vorhandenen Datensätze
Bytes 40 - 41: Anzahl der vorhandenen Pages
Bytes 32 - 33: scheinen in direkter Verbindung zu Bytes 40 - 41 zu stehen (enthalten meist den um 1 verminderten Wert von Byte 40 - 41)

Ab Byte 256: Definition der Indizes 
16 einleitende Bytes
dann ein 30-Byte-Block je Index
Bytes 6 - 7: Anzahl der Index-Einträge
Bytes 10 - 11: Summe der Bytes für alle Datentypen (alle Spalten) dieses Index
Bytes 12 - 13: Bytes für gesamten Indexeintrag (inkl. Adressierung 4 oder 8 Bytes und  4 mal 0xFF als Endzeichen des Index)
Bytes 20 - 21: Position im Datensatz in Bytes (beginnend mit Byte 0)
Bytes 22 - 23: Bytes für den Datentyp dieses Index-Bestandteils (dieser Spalte)
Bytes 28 - 29: Datentyp dieses Index-Bestandteils (dieser Spalte)

*Index-Page:*
Bytes 6 - 7: Anzahl der folgenden Index-Einträge
Bytes 8 - 15: 8 * 0xFF

Für jede weitere Information oder Quellenangabe wäre ich dankbar.
Insbesondere würde ich Informationen dazu schätzen, wo die Größe der Datensätze zu finden ist, eine Spaltenanzahl, und ob es damals unter Btrieve ein 40-Bit Format für Fließkommazahlen als Datentyp gab (und wie dieses aufgebaut war).

Dokumentationen zum Aufbau der Dateien (Spaltenanzahl, Datentypen) liegen mir nicht vor, es ist lediglich das alte DOS-Programm, das diese Dateien verwendet, vorhanden.
Dass mir mit dem Erkennen der verwendeten Datentypen noch ein "bißchen" Arbeit bevorsteht ist mir bekannt.

Ich werde mich bemühen, neue Infos in diesem Post zu sammeln, so dass nicht jeder die gesamten Posts danach absuchen muss (Falls das nicht gewünscht ist, bitte ich um kurze Info durch einen Mod.)

Vielen Dank im Voraus!


----------



## BudMinton (12. Mai 2010)

Hallo,

ich hab sowas vor etlichen Jahren ebenfalls ohne *.ddf auch mal auf dem Tisch gehabt. 
Ziel war die Portierung nach Access 2.0. Bei dem Stand an dem Du jetzt gerade bist, habe ich damals
ein Tool im Internet gefunden, dass aus den vorhandenen Daten die DDF rekonstruieren konnte.
Das war allerdings auch nicht vollautomatisch. Es wurde eher geraten, die Daten angezeigt und man musste teilweise entscheiden welcher Datentyp die Daten am Besten repräsentiert. Hat mir trotzdem eine Menge Zeit gespart.

Mit Links etc. kann ich leider nicht dienen. 
Ob die Diskette mit dem Tool noch lesbar wäre, wenn ich im Keller danach suchen würde, weiß ich nicht.
Vielleicht findet man das ja doch noch im Netz. 

Vom selber austüffteln würde ich Dir eher abraten.


----------



## BudMinton (12. Mai 2010)

P.S. gerade viel der Groschen:
http://www.scottsmithonline.com/WebArchive/Smithware/products/winddf.html


----------



## BudMinton (12. Mai 2010)

P.S. man braucht beide Tools:
http://www.scottsmithonline.com/WebArchive/Smithware/products/ddfsniff.html


----------



## c4esar (12. Mai 2010)

Zunächst erstmal vielen Dank für Deine Mühe.

Das muss aber wirklich vor etlichen Jahren gewesen sein 
Inzwischen gehört Smithware anscheinend zu Pervasive, und laut deren Homepage gibt es diese beiden Programme leider nicht mehr als gesonderte Produkte.

Die Suche nach Doku bzw. mein Trial-and-Error geht also weiter...


----------



## ToBtr (30. Juni 2010)

Hallo,

ich bin Heute zufällig auf dieses Post gekommen. Da ich vor wenigen Wochen einmal ein Projekt hatte in welchem Dateien komplett ohne Datenbank gelesen werden mussten habe ich auch alles durchgesucht. Ich hab dan ein Post bei dbcoretech (in deren Blog) gefunden (http://www.dbcoretech.com/?p=108). Dort gibt es einen Header der den Satzaufbau der Daten beschreibt. 
Wir haben dann mit dbcoretech selbst Kontakt aufgenommen und um Hilfe gebeten. Das Problem liegt in der Art wie Btrieve selbst die Daten speichert. Es gibt keinerelei Spalten oder Beschreibungsinformationen innerhalb der Dateien. Die Anwendungen lesen die Datensätze als BLOB und machen letztlich das was sie wollen damit. So wie mir ein Herr Fiedler beschrieben hat könnte man sogar Spalten überlagern, also Byte 0-10 String und Spalte 5-15 String. Das Dateiformat speichert zum einen die Daten der Datensätze (klar) und zusätzlich nur noch welche Bereiche Indiziert sind. Mehr informationen gibt es leider nicht. 

Hoffe das Hilft.....


Tobi


----------



## c4esar (7. Juli 2010)

Hi!

Vielen Dank! Werde mich da mal durcharbeiten.
Ich hatte es jetzt aufgegeben, ein Programm zu erstellen, dass wirklich alles automatisch kann.
Es erstellt nur eine grobe Einschätzung, welches Feld welcher Datentyp sein könnte, und den Rest passe ich dann an die jeweilige Datei an.

Die wichtigste Erkenntnis für mich war, dass in meinen Dateien meist ein uraltes Fließkommaformat vorkommt, und zwar handelt es sich offensichtlich um das REAL-Format aus TurboPASCAL (48 Bit).

Für Interessierte:
Byte 0: Exponent mit einem Bias von 129
Byte 1 - 5: Mantisse, allerdings Little Endian abgelegt
Byte 5, Bit 7: Vorzeichen
Die Mantisse setzt sich also aus Byte 5, Bit 6 - 0, Byte 4, Bit 7 - 0, Byte 3, Bit 7 -0... zusammen

Der Hex-Wert 0x82690A7ED5FF steht so z.B. für -3,9974055387


----------

