Sie sind hier: dBase format
Zurück zu: File Formats
Allgemein:
Vorlesungen
Labore
Sinnvolle Programme
Lineare Regression
GUI-Entwurfsarbeit
Single-Format
Design Pattern-Termine
Observer1
Bsp2
Json-Array
Json-Dialogelemente
Webtechnologien
A dBase File has a prefix, a header and rows of data.
Prefix
- id (byte)
- year (byte)
- month (byte)
- day (byte)
- Number of records (UInt32)
- headersite (Uint16)
- RecordSize (Uint16)
- 20 fillbytes
Byte/Offset | Number of Bytes | Description |
0 | 1 |
dBase Version, Valid dBASE for Windows table file, bits 0-2 indicate version number: 3 for dBASE Level 5, 4 for dBASE Level 7. Bit 3 and bit 7 indicate presence of a dBASE IV or dBASE for Windows memo file; bits 4-6 indicate the presence of a dBASE IV SQL table; bit 7 indicates the presence of any .DBT memo file (either a dBASE III PLUS type or a dBASE IV or dBASE for Windows memo file). |
1-3 | 3 | YY / MM / DD |
4-7 | unsgined 32 Bit | Number of records |
8-9 | unsgined 16 Bit | Number of bytes in the header |
10-11 | unsgined 16 Bit | Number of bytes in the records |
12-13 | 2 | reserved |
14 | 1 | Flag indicating incomplete dBASE IV transaction. |
15 | 1 | dBASE IV encryption flag. |
16-27 | 12 | reserved |
28 | 1 | Production MDX flag; 0x01 if a production .MDX file exists for this table; 0x00 if no .MDX file exists. |
29 | 1 | Language driver ID |
30-31 | 2 | Reserved |
32-63 | 32 | Language driver name |
64-67 | 4 | Reserved |
68-n | 48 Byte each | Field descriptor |
n+1 | 1 | Field descriptor terminator |
n+2 |
Byte/Offset | Number of Bytes | Description |
0-31 | 32 |
Fieldname (zero-filled) read only until byte-value are zero |
32 | 1 |
Field type in ASCII (B, C, D, N, L, M, @, I, +, F, 0 or G). B: blog C: Chars D: Date N: Numeric L: Logical, boolean I: Integer |
35-36 | 2 | reserved |
37 | 1 | Production .MDX field flag; 0x01 if field has an index tag in the production .MDX file; 0x00 if the field is not indexed. |
38-39 | 2 | reserved |
40-43 | 4 | Next Autoincrement value, if the Field type is Autoincrement, 0x00 otherwise. |
44-47 | 4 | reserved |
class Dbheader3 { public byte id; // 2=dbase2 3=dbase3 131=dBase3 mit Memofeld public byte jahr; // datum public byte monat; public byte tag; public UInt32 anzrec; // Anzahl der Datensaetze */ public UInt16 headersize; // Headergroesse in Byte */ public UInt16 recsize; // Laenge eines einzelnen Datensatzes public byte[] dummy; } class Field { public String fieldname; // 11 Zeichen public char typ; // C=String; N=Zahl; D=Datum; L=Boolean M=Memotext public UInt32 fieldadr; // Anzahl der Datensaetze */ public byte size; public byte nk; // 14 dummys public UInt16 offset; } class Row { private static byte[] dummy = new byte[255]; public List
class Dbheader3 { public byte id; // 2=dbase2 3=dbase3 131=dBase3 mit Memofeld public byte jahr; // datum public byte monat; public byte tag; public UInt32 anzrec; // Anzahl der Datensaetze */ public UInt16 headersize; // Headergroesse in Byte */ public UInt16 recsize; // Laenge eines einzelnen Datensatzes public byte[] dummy; } class Field { public String fieldname; // 11 Zeichen public char typ; // C=String; N=Zahl; D=Datum; L=Boolean M=Memotext public UInt32 fieldadr; // Anzahl der Datensaetze */ public byte size; public byte nk; // 14 dummys public UInt16 offset; } class Row { public void loadRow(BinaryReader inStream, Listfieldlist) { String strValue; Decimal decValue; int intValue; foreach (Field_rec fieldrec in fieldlist) { switch (fieldrec.typ) { case 'C': // read size bytes dummy = inStream.ReadBytes(fieldrec.size); sb.Clear(); for (int i = 0; i < fieldrec.size; i++) { sb.Append(((char)dummy[i]).ToString()); } strValue = sb.ToString(); attribs.Add(strValue.Trim().Clone()); break; case 'I': // read size bytes Integer dummy = inStream.ReadBytes(fieldrec.size); sb.Clear(); for (int i = 0; i < fieldrec.size; i++) { sb.Append(((char)dummy[i]).ToString()); } strValue = sb.ToString(); if (int.TryParse(strValue, out intValue)) attribs.Add(intValue); else attribs.Add(0); break; case 'F': // n nk 10/4 12345.1234 dummy = inStream.ReadBytes(fieldrec.size); sb.Clear(); for (int i = 0; i < fieldrec.size; i++) { sb.Append(((char)dummy[i]).ToString()); } strValue = sb.ToString().Trim(); if (Decimal.TryParse(strValue, System.Globalization.NumberStyles.AllowDecimalPoint | System.Globalization.NumberStyles.AllowLeadingSign, System.Globalization.CultureInfo.InvariantCulture, out decValue)) attribs.Add(decValue); else attribs.Add(0.0); break; case 'L': dummy = inStream.ReadBytes(fieldrec.size); if (dummy.Equals("T") || dummy.Equals("True") || dummy.Equals("Wahr")) attribs.Add(true); else attribs.Add(true); break; case 'D': dummy = inStream.ReadBytes(fieldrec.size); sb.Clear(); for (int i = 0; i < fieldrec.size; i++) { sb.Append(((char)dummy[i]).ToString()); } strValue = sb.ToString(); attribs.Add(strValue.Clone()); break; case 'M': break; } // switch } } }
public String readdBaseFile2String(String filename) { const byte eof = 26; const byte rowIsDelete = 42; // * StringBuilder sb = new StringBuilder(); Listtabelle = new List
(); FileStream inFile = null; BinaryReader inStream = null; try { Dbheader3 header = new Dbheader3(); inFile = new FileStream(filename, FileMode.Open); inStream = new BinaryReader(inFile); header.load1(inStream); sb.AppendLine("Header: "); sb.AppendLine(header.ToString()); // Felder bestimmen List
fieldlist = new List (); Field_rec field; while (true) { field = new Field_rec(); field.load(inStream); String name = field.fieldname; fieldlist.Add(field); long position = inFile.Position; // Preview für byte eoffield = inStream.ReadByte(); if (eoffield == 13) { break; } else { inFile.Seek(position, SeekOrigin.Begin); } } sb.AppendLine(); sb.AppendLine("Felder"); foreach (Field_rec fieldloop in fieldlist) { sb.AppendLine(fieldloop.ToString()); } byte flag; Row row; // vor jedem Datensatz steht das "Deleteflag 20=okay 46=gelöscht while (true) { flag = inStream.ReadByte(); // space oder * oder 1A if (flag == eof) { break; } // if (flag!=eof) { row = new Row(); row.loadRow(inStream, fieldlist); if (flag != rowIsDelete) { tabelle.Add(row); } // } // while int anzDatensaetze = tabelle.Count; sb.AppendLine("anzDatensaetze:" + anzDatensaetze); foreach (Row rowloop in tabelle) { rowloop.printFields(sb); } inStream.Close(); inFile.Close(); } catch (Exception e) { sb.AppendLine("Fehler beim Öffnen der Datei:"); sb.Append(" "); sb.AppendLine(filename); sb.AppendLine("Fehlermeldung:"); sb.Append(" "); sb.AppendLine(e.ToString()); inStream.Close(); inFile.Close(); } return sb.ToString(); }
description: dBase.pdf
dBase-Files: dbf-files.zip
sales.dbf with a hexviewer: sales.txt
samples programm in c#
dBase.zip (only the program)
dBase.exe (only the program)
dBase-source.zip
dbase.jpg