On Mon, 11 Jan 2010, Maurilio Longo wrote: Hi,
> do you have any idea which program/language writes such kind of .dbf files? Probably some newer dBase versions, i.e. Visual dBase but I've never used them so I cannot help you. Maybe some dBase users can help you. Of course if the signature confirms the standards and it's real dBase file. I'm attaching description of dBase7 format so you can check if your file confirms it. best regards, Przemek
Data File Header Structure for the dBASE Version 7 Table File Note: Unless prefaced by "0x", all numbers specified in the Description column of the following tables are decimal. 1.1 Table File Header +------------------------------------------------------------------------+ | Byte | Contents | Description | |-------+----------------------+-----------------------------------------| | | | 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 | | 0 | 1 byte | 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). | |-------+----------------------+-----------------------------------------| | | | Date of last update; in YYMMDD format. | | | | Each byte contains the number as a | | | | binary. YY is added to a base of 1900 | | 1-3 | 3 bytes | decimal to determine the actual year. | | | | Therefore, YY has possible values from | | | | 0x00-0xFF, which allows for a range | | | | from 1900-2155. | |-------+----------------------+-----------------------------------------| | 4-7 | 32-bit number | Number of records in the table. (Least | | | | significant byte first.) | |-------+----------------------+-----------------------------------------| | 8-9 | 16-bit number | Number of bytes in the header. (Least | | | | significant byte first.) | |-------+----------------------+-----------------------------------------| | 10-11 | 16-bit number | Number of bytes in the record. (Least | | | | significant byte first.) | |-------+----------------------+-----------------------------------------| | 12-13 | 2 bytes | Reserved; filled with zeros. | |-------+----------------------+-----------------------------------------| | 14 | 1 byte | Flag indicating incomplete dBASE IV | | | | transaction. | |-------+----------------------+-----------------------------------------| | 15 | 1 byte | dBASE IV encryption flag. | |-------+----------------------+-----------------------------------------| | 16-27 | 12 bytes | Reserved for multi-user processing. | |-------+----------------------+-----------------------------------------| | | | Production MDX flag; 0x01 if a | | 28 | 1 byte | production .MDX file exists for this | | | | table; 0x00 if no .MDX file exists. | |-------+----------------------+-----------------------------------------| | 29 | 1 byte | Language driver ID. | |-------+----------------------+-----------------------------------------| | 30-31 | 2 bytes | Reserved; filled with zeros. | |-------+----------------------+-----------------------------------------| | 32-63 | 32 bytes | Language driver name. | |-------+----------------------+-----------------------------------------| | 64-67 | 4 bytes | Reserved. | |-------+----------------------+-----------------------------------------| | 68-n | 48 bytes each | Field Descriptor Array (see 1.2). | |-------+----------------------+-----------------------------------------| | n+1 | 1 byte | 0x0D stored as the Field Descriptor | | | | terminator. | |-------+----------------------+-----------------------------------------| | n+2 | See below for | Field Properties Structure | | | calculations of size | | +------------------------------------------------------------------------+ n above is the last byte in the field descriptor array. The size of the array depends on the number of fields in the table file. 1. 2 Field Descriptor Array (One for each field in the table) +------------------------------------------------------------------------+ | Byte | Contents | Description | |-------+----------+-----------------------------------------------------| | 0-31 | 32 bytes | Field name in ASCII (zero-filled). | |-------+----------+-----------------------------------------------------| | 32 | 1 byte | Field type in ASCII (B, C, D, N, L, M, @, I, +, F, | | | | 0 or G). | |-------+----------+-----------------------------------------------------| | 33 | 1 byte | Field length in binary. | |-------+----------+-----------------------------------------------------| | 34 | 1 byte | Field decimal count in binary. | |-------+----------+-----------------------------------------------------| | 35-36 | 2 bytes | Reserved. | |-------+----------+-----------------------------------------------------| | | | Production .MDX field flag; 0x01 if field has an | | 37 | 1 byte | index tag in the production .MDX file; 0x00 if the | | | | field is not indexed. | |-------+----------+-----------------------------------------------------| | 38-39 | 2 bytes | Reserved. | |-------+----------+-----------------------------------------------------| | 40-43 | 4 bytes | Next Autoincrement value, if the Field type is | | | | Autoincrement, 0x00 otherwise. | |-------+----------+-----------------------------------------------------| | 44-47 | 4 bytes | Reserved. | +------------------------------------------------------------------------+ 1.3 Field Properties Structure This contains a header describing the Field Properties array, followed by the actual array, followed by property data. It is contained in the .DBF header and comes immediately after the Field Descriptor terminator (See Table 1.1). +------------------------------------------------------------------------+ | Byte | Contents | Description | |---------+---------------+----------------------------------------------| | 0-1 | 16-bit number | Number of Standard Properties. | |---------+---------------+----------------------------------------------| | 2-3 | 16-bit number | Start of Standard Property Descriptor Array. | | | | (see 1.3.1 ) | |---------+---------------+----------------------------------------------| | 4-5 | 16-bit number | Number of Custom Properties. | |---------+---------------+----------------------------------------------| | 6-7 | 16-bit number | Start of Custom Property Descriptor Array. | | | | (see 1.3.2 ) | |---------+---------------+----------------------------------------------| | 8-9 | 16-bit number | Number of Referential Integrity (RI) | | | | properties. | |---------+---------------+----------------------------------------------| | 10-11 | 16-bit number | Start of RI Property Descriptor Array. (see | | | | 1.3.3 ) | |---------+---------------+----------------------------------------------| | | | Start of data - this points past the | | 12-13 | 16-bit number | Descriptor arrays to data used by the arrays | | | | - for example Custom property names are | | | | stored here. | |---------+---------------+----------------------------------------------| | | | Actual size of structure, including data | | | | (Note: in the .DBF this will be padded with | | 14-15 | 16-bit number | zeroes to the nearest 0x200, and may have | | | | 0x1A at the end). If the structure contains | | | | RI data, it will not be padded. | |---------+---------------+----------------------------------------------| | | | Standard Property Descriptor Array (n = | | 16-n | 15 bytes each | (15*number of standard properties) + 16). | | | | (see 1.3.1) | |---------+---------------+----------------------------------------------| | (n+1)-m | 14 bytes each | Custom Property Descriptor Array (m = n+ | | | | 14*number of custom properties). (see 1.3.2) | |---------+---------------+----------------------------------------------| | (m+1)-o | 22 bytes each | RI Property Descriptor Array (o = m+ | | | | 22*number of RI properties). (see 1.3.3) | +------------------------------------------------------------------------+ 1.3.1 Standard Property and Constraint Descriptor Array +------------------------------------------------------------------------+ | Byte | Contents | Description | |-------+---------------+------------------------------------------------| | | | Generational number. More than one value may | | 0-1 | 16-bit number | exist for a property. The current value is the | | | | value with the highest generational number. | |-------+---------------+------------------------------------------------| | | | Table field offset - base one. 01 for the | | 2-3 | 16-bit number | first field in the table, 02 for the second | | | | field, etc. Note: this will be 0 in the case | | | | of a constraint. | |-------+---------------+------------------------------------------------| | | | Which property is described in this record: | | | | 01 Required | | 4 | 8-bit number | 02 Min | | | | 03 Max | | | | 04 Default | | | | 06 Database constraint | |-------+---------------+------------------------------------------------| | | | Field Type: | | | | 00 No type - constraint | | | | 01 Char | | | | 02 Numeric | | | | 03 Memo | | | | 04 Logical | | | | 05 Date | | 5 | 1 byte | 06 Float | | | | 08 OLE | | | | 09 Binary | | | | 11 Long | | | | 12 Timestamp | | | | 13 Double | | | | 14 AutoIncrement (not settable from the | | | | Inspector) | |-------+---------------+------------------------------------------------| | 6 | 1 byte | 0x00 if the array element is a constraint, | | | | 0x02 otherwise. | |-------+---------------+------------------------------------------------| | 7-10 | 4 bytes | Reserved | |-------+---------------+------------------------------------------------| | | | Offset from the start of this structure to the | | 11-12 | 16-bit number | data for the property. The Required property | | | | has no data associated with it, so it is | | | | always 0. | |-------+---------------+------------------------------------------------| | | | Width of database field associated with the | | 13-14 | 16-bit number | property, and hence size of the data (includes | | | | 0 terminator in the case of a constraint). | +------------------------------------------------------------------------+ 1.3.2 Custom Property Descriptor Array +------------------------------------------------------------------------+ | Byte | Contents | Description | |-------+---------------+------------------------------------------------| | | | Generational number. More than one value may | | 0-1 | 16-bit number | exist for a property. The current value is the | | | | value with the highest generational number. | |-------+---------------+------------------------------------------------| | | | Table field offset - base one. 01 for the | | 2-3 | 16-bit number | first field in the table, 02 for the second | | | | field, etc. | |-------+---------------+------------------------------------------------| | | | Field Type | | | | 01 Char | | | | 02 Numeric | | | | 03 Memo | | | | 04 Logical | | | | 05 Date | | 4 | 1 byte | 06 Float | | | | 08 OLE | | | | 09 Binary | | | | 11 Long | | | | 12 Timestamp | | | | 13 Double | | | | 14 AutoIncrement (not settable from the | | | | Inspector) | |-------+---------------+------------------------------------------------| | 5 | 1 byte | Reserved | |-------+---------------+------------------------------------------------| | 6-7 | 16-bit number | Offset from the start of this structure to the | | | | Custom property name. | |-------+---------------+------------------------------------------------| | 8-9 | 16-bit number | Length of the Custom property name. | |-------+---------------+------------------------------------------------| | 10-11 | 16-bit number | Offset from the start of this structure to the | | | | Custom property data. | |-------+---------------+------------------------------------------------| | 12-13 | 16-bit number | Length of the Custom property data (does not | | | | include null terminator). | +------------------------------------------------------------------------+ 1.3.3 Referential Integrity Property Descriptor Array +------------------------------------------------------------------------+ | Byte | Contents | Description | |-------+---------------+------------------------------------------------| | 0 | 8-bit number | 0x07 if Master (parent), 0x08 if Dependent | | | | (child). | |-------+---------------+------------------------------------------------| | 1-2 | 16-bit number | Sequential number, 1 based counting. If this | | | | number is 0, this RI rule has been dropped. | |-------+---------------+------------------------------------------------| | 3-4 | 16-bit number | Offset of the RI rule name - 0 terminated. | |-------+---------------+------------------------------------------------| | 5-6 | 16-bit number | Size of previous value. | |-------+---------------+------------------------------------------------| | 7-8 | 16-bit number | Offset of the name of the Foreign Table - 0 | | | | terminated. | |-------+---------------+------------------------------------------------| | 9-10 | 16-bit number | Size of previous value. | |-------+---------------+------------------------------------------------| | | | Update & delete behaviour: | | 11 | 1 byte | Update Cascade 0x10 | | | | Delete Cascade 0x01 | |-------+---------------+------------------------------------------------| | 12-13 | 16-bit number | Number of fields in the linking key. | |-------+---------------+------------------------------------------------| | 14-15 | 16-bit number | Offset of the Local Table tag name - 0 | | | | terminated. | |-------+---------------+------------------------------------------------| | 16-17 | 16-bit number | Size of previous value. | |-------+---------------+------------------------------------------------| | 18-19 | 16-bit number | Offset of the Foreign Table tag name - 0 | | | | terminated. | |-------+---------------+------------------------------------------------| | 20-21 | 16-bit number | Size of previous value. | +------------------------------------------------------------------------+ (Foreign = in the other table, Local = in this table) Property Data For standard properties, everything is stored exactly as it is in the Table records. Custom property data is stored as the Name string, followed immediately by the Value string, and a null terminator. The Constraint text is stored as a null-terminated string. Table Records The records follow the header in the table file. Data records are preceded by one byte, that is, a space (0x20) if the record is not deleted, an asterisk (0x2A) if the record is deleted. Fields are packed into records without field separators or record terminators. The end of the file is marked by a single byte, with the end-of-file marker, an OEM code page character value of 26 (0x1A). Storage of dBASE Data Types Except for autoincrement fields, all types are initialized to binary zeroes. In addition, any fields which have been assigned a default property will contain the default value. +------------------------------------------------------------------------+ | Symbol | Data Type | Description | |--------+------------------+--------------------------------------------| | | | 10 digits representing a .DBT block | | B | Binary, a string | number. The number is stored as a string, | | | | right justified and padded with blanks. | |--------+------------------+--------------------------------------------| | C | Character | All OEM code page characters - padded with | | | | blanks to the width of the field. | |--------+------------------+--------------------------------------------| | D | Date | 8 bytes - date stored as a string in the | | | | format YYYYMMDD. | |--------+------------------+--------------------------------------------| | | | Number stored as a string, right | | N | Numeric | justified, and padded with blanks to the | | | | width of the field. | |--------+------------------+--------------------------------------------| | L | Logical | 1 byte - initialized to 0x20 (space) | | | | otherwise T or F. | |--------+------------------+--------------------------------------------| | | | 10 digits (bytes) representing a .DBT | | M | Memo, a string | block number. The number is stored as a | | | | string, right justified and padded with | | | | blanks. | |--------+------------------+--------------------------------------------| | | | 8 bytes - two longs, first for date, | | | | second for time. The date is the number | | @ | Timestamp | of days since 01/01/4713 BC. Time is | | | | hours * 3600000L + minutes * 60000L + | | | | Seconds * 1000L | |--------+------------------+--------------------------------------------| | I | Long | 4 bytes. Leftmost bit used to indicate | | | | sign, 0 negative. | |--------+------------------+--------------------------------------------| | + | Autoincrement | Same as a Long | |--------+------------------+--------------------------------------------| | | | Number stored as a string, right | | F | Float | justified, and padded with blanks to the | | | | width of the field. | |--------+------------------+--------------------------------------------| | O | Double | 8 bytes - no conversions, stored as a | | | | double. | |--------+------------------+--------------------------------------------| | | | 10 digits (bytes) representing a .DBT | | G | OLE | block number. The number is stored as a | | | | string, right justified and padded with | | | | blanks. | +------------------------------------------------------------------------+ Binary, Memo, OLE Fields and .DBT Files Binary, memo, and OLE fields store data in .DBT files consisting of blocks numbered sequentially (0, 1, 2, etc.). SET BLOCKSIZE determines the size of each block. The first block in the .DBT file, block 0, is the .DBT file header. Each binary, memo, or OLE field of each record in the .DBF file contains the number of the block (in OEM code page values) where the field's data actually begins. If a field contains no data, the .DBF file contains blanks (0x20) rather than a number. When data is changed in a field, the block numbers may also change and the number in the .DBF may be changed to reflect the new location.
_______________________________________________ Harbour mailing list (attachment size limit: 40KB) Harbour@harbour-project.org http://lists.harbour-project.org/mailman/listinfo/harbour