Estructura de DBF: una referencia del formato
El formato tiene más de cuarenta años, la especificación se ha dividido en dialectos y no hay un único estándar. Esta página reúne lo que hace falta para leer un archivo uno mismo o para entender por qué el programa de otro no puede.
El encabezado: los primeros 32 bytes
| Desplazamiento | Tamaño | Contenido |
|---|---|---|
| 0 | 1 | versión del formato: 0x03 dBase III, 0x30 Visual FoxPro, 0x83 dBase III con memo |
| 1–3 | 3 | fecha de la última actualización: año (dos dígitos), mes, día |
| 4–7 | 4 | número de registros |
| 8–9 | 2 | longitud del encabezado: ahí empiezan los datos |
| 10–11 | 2 | longitud de un registro |
| 28 | 1 | indicadores de la tabla: 0x01 tiene .cdx, 0x02 tiene memo, 0x04 pertenece a un .dbc |
| 29 | 1 | controlador de idioma (página de códigos) |
Una consecuencia útil: el número de registros se puede comprobar con aritmética. (tamaño del archivo − longitud del encabezado) ÷ longitud del registro debe ser igual al contador. Si no lo es, el archivo se truncó o el contador miente.
Descriptores de campo
Justo después del encabezado vienen las definiciones de campo, de 32 bytes cada una, seguidas de un byte 0x0D que marca el final de la lista.
Cada descriptor contiene el nombre (11 bytes, rellenado con ceros), el tipo (1 byte), el desplazamiento del campo (4 bytes), la longitud (1 byte), el número de decimales (1 byte) y los indicadores (1 byte). Por eso los nombres de campo se limitan a diez caracteres.
dBase Level 7 es un caso especial: el nombre ocupa 32 bytes y todo el descriptor, 48. Las dos disposiciones se distinguen por su estructura: compruebe cuál hace que las longitudes de los campos sumen la longitud del registro del encabezado.
Tipos de campo
| Tipo | Significado | Cómo se guarda |
|---|---|---|
C | cadena de caracteres | texto, rellenado con espacios por la derecha |
N, F | número | como texto, alineado a la derecha |
D | fecha | ocho caracteres AAAAMMDD |
L | lógico | un carácter: T, F, Y, N o un espacio |
M | memo | un número de bloque en un archivo externo |
I | entero | 4 bytes, little-endian |
T | fecha y hora | 8 bytes: un día juliano y milisegundos |
Y | moneda | un entero de 8 bytes, dividido entre 10.000 |
B | doble en Visual FoxPro, memo en dBase | depende de la versión: fuente frecuente de errores |
Los números guardados como texto no son un arcaísmo sino una virtud: N(12,2) contiene exactamente lo que se ve, sin redondeo binario. Por eso los totales de un DBF no se «desvían» como en los formatos de coma flotante.
Registros y marca de eliminación
Los registros van uno tras otro, todos de la misma longitud. La dirección de cualquier registro es una multiplicación, así que el acceso a un registro es instantáneo.
El primer byte de cada registro es un byte de servicio: un espacio significa que el registro está activo y un asterisco, que está marcado como eliminado. Más sobre esto en su propio artículo.
Visual FoxPro añade un campo de sistema, _NullFlags: una máscara de bits en la que cada bit indica que el campo correspondiente contiene NULL. Sin interpretarlo, los valores vacíos parecen ceros y cadenas vacías, y la diferencia importa.
Preguntas frecuentes
¿Por qué el mismo tipo se lee distinto en herramientas distintas?
Por los dialectos. El ejemplo clásico es el tipo B: en Visual FoxPro es un número de doble precisión y en dBase una referencia a un memo binario.
¿Cómo averiguo la versión del formato?
Por el primer byte del archivo. Pero la versión solo nombra el dialecto: si hay memo se juzga mejor por los tipos de campo reales.
¿Para qué sirve el archivo .cdx que hay junto a la tabla?
Es un índice para búsquedas y ordenaciones rápidas. Sus datos duplican los de la tabla, así que tras editar la tabla sin el índice hay que reconstruirlo.
Gratis para usar. Su archivo no se sube a ningún servidor. Versión para Windows — 4.6 MB, sin instalación: detalles. Pro — 29 USD una sola vez: precio.