Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
Все было бы хорошо, если бы не BDE... Нет, BDE - это очень даже хорошо, плохо то, что использовав в программе однажды TTable, приходится ломать голову над тем, как же с минимальными потерями "прикрутить" BorlandDatabaseEngine к пользовательской машине. Это первое, что заставляет сесть за изучение заголовков DBF-файлов. И второе. Эти самые DBF-файлы имеют такую особенность, как разрушение заголовков. И третье, и четвертое, и пятое...
Для Вас не составляет сложности написать компонент, который работает с DBF-таблицами?.
В этом случае НЕМЕДЛЕННО прекратите чтение статьи!
А мы же посмотрим, что из себя представляют заголовки DBF-файлов и как можно использовать свои знания о них в практическом применении.
Структура DBF-файла
DBF-файл состоит из двух частей:
Схематично все это можно представить так:
| Кол-во байт | Наименование |
|---|---|
| 32 | Заголовок DBF-файла |
| 32 | Описание первого поля |
| 32 | Описание второго поля |
| ... | ... |
| 32 | Описание n-го поля |
| 1 | Завершающий символ 0x0D (13) |
| RecordSize | Первая запись из n-полей |
| RecordSize | Вторая запись из n-полей |
| ... | ... |
| RecordSize | m-я запись из n-полей, где m=RecordsCount |
| 1 | Завершающий символ 0x1A (26) |
RecordSize (размер записи в байтах) и RecordsCount (количество записей), значения которых берутся из заголовка DBF-файла, будут рассмотрены ниже. Теперь, когда мы знаем из каких частей состоит DBF-файл и какой размер они имеют, перейдем к более подробному рассмотрению их структуры.
Описание заголовка DBF-файла
Как видно из предыдущей таблицы, заголовок состоит из трех частей:
Размер "собственно заголовка" составляет 32 байта, каждый из которых несет строго определенное значение.
| № байта | Размер | Значение | Описание | Используется |
|---|---|---|---|---|
| 00 | 1 | 0x03(3) | простая таблица | FS, D3, D4, D5, Fb, Fp, CL |
| 0x04(4) | простая таблица | D4, D5 (FS) | ||
| 0x05(5) | простая таблица | D5, Fp (FS) | ||
| 0x43(67) | с мемо-полем .dbv | FS | ||
| 0xB3(179) | с мемо-полями .dbv .dbt | FS | ||
| 0x83(131) | с мемо-полем .dbt | FS, D3, D4, D5, Fb, Fp, CL | ||
| 0x8B(139) | с мемо-полем .dbt формат D4 | D4, D5 | ||
| 0x8E(142) | SQL-таблица | D4, D5 | ||
| 0xF5(245) | с мемо полем .fmp | Fp | ||
| 01 | 1 | YY | Год последнего обновления таблицы | Все |
| 02 | 1 | MM | Месяц последнего обновления таблицы | Все |
| 03 | 1 | DD | День последнего обновления таблицы | Все |
| 04 | 4 | RecordsCount | Количество записей в таблице | Все |
| 08 | 2 | HeaderSize | Размер заголовка в байтах | Все |
| 10 | 2 | RecordSize | Размер записи в байтах | Все |
| 12 | 2 | 0x00,0x00 | Зарезервировано | Все |
| 14 | 1 | 0x01 | Начало транзакции | D4, D5 |
| 0x00 | Конец транзакции | D4, D5 | ||
| 0x00 | Игнорируется | FS, D3, Fb, Fp, CL | ||
| 15 | 1 | 0x01 | Закодировано | D4, D5 |
| 0x00 | Нормальная видимость | Все | ||
| 16 | 12 | 0 (1) | Использование многопользовательского окружения | D4, D5 |
| 28 | 1 | 0x01 | Используется индекс | Fp, D4, D5 |
| 0x00 | Индекс не используется | Все | ||
| 29 | 1 | n | Номер драйвера языка | D4, D5 |
| 0x01(1) | кодовая страница 437 DOS USA | Fp | ||
| 0x02(2) | кодовая страница 850 DOS Multilang | Fp | ||
| 0x26(38) | кодовая страница 866 DOS Russian | Fp | ||
| 0x57(87) | кодовая страница 1251 Windows ANSI | Fp | ||
| 0xC8(200) | кодовая страница 1250 Windows EE | Fp | ||
| 0x00(0) | игнорируется | FS, D3, Fb, Fp, CL | ||
| 30 | 2 | 0x00,0x00 | Зарезервировано | Все |
Сокращения:
Таким образом мы сумели описать первых 32 байта DBF-файла. Начиная с 33 байта начинаются описания полей, каждое из которых также имеет размер в 32 байта.
Структура описания полей в заголовке DBF-файла
| № байта | Размер | Значение | Описание | Используется |
|---|---|---|---|---|
| 00 | 11 | ASCII | Имя поля с 0x00 завершением | Все |
| 11 | 1 | ASCII | Тип поля см. Таблицу 4 | Все |
| 12 | 4 | n,n,n,n | Адрес поля в памяти | D3 |
| 0,0,n,n | Смещение относительно начала записи | Fp | ||
| 0,0,0,0 | Игнорируется | FS, D4, D5, Fb, CL | ||
| 16 | 1 | Byte | Размер поля см. Таблицу 4 | Все |
| 17 | 1 | Byte | Количество знаков после запятой | Все |
| 18 | 2 | 0,0 | Зарезервировано | Все |
| 20 | 1 | Byte | Идентификатор рабочей области | D4,D5 |
| 0x00 | Не используется | FS, D3, Fb, Fp, CL | ||
| 21 | 2 | n,n | Многопользовательский dBase | D3, D4, D5 |
| 0,0 | Игнорируется | FS Fb, Fp, CL | ||
| 23 | 1 | 0x01 | Установленные поля | D3, D4, D5 |
| 0x00 | Игнорируется | FS Fb, Fp, CL | ||
| 24 | 7 | 0..0 | Зарезервировано | Все |
| 31 | 1 | 0x01 | Поле включено в .mdx индекс | D4, D5 |
| 0x00 | Игнорируется | D3, FS, Fb, Fp, CL |
| Код | Тип | Размер | Описание/Размер | Используется |
|---|---|---|---|---|
| C | 1..n | Char | n ASCII символов | Все |
| пустые места - пробел 0x20(32) | ||||
| n = 1..64Kbt | FS | |||
| n = 1..32Kbt | Fp, CL | |||
| n = 1..254 | Все | |||
| D | 8 | Date | 8 ASCII знаков (0..9) в формате YYYYMMDD | Все |
| F | 1..n | Float | ASCII символы(-.0123456789) переменная позиция плавающей точки n = 1..20 | FS, D4, D5, Fp |
| N | 1..n | Numeric | ASCII символы (-.0123456789) фиксированная позиция точки | Все |
| n = 1..20 | FS, Fp, CL | |||
| n = 1..18 | D3, D4, D5, Fb | |||
| L | 1 | Logical | ASCII символы (Yy Tt Nn Ff, пробел - не определено) | FS, D3, Fb, Fp, CL |
| ASCII символы (Yy Tt Nn Ff, ? - не определено) | D4, D5 (FS) | |||
| M | 10 | Memo | 10 цифр, определяющих начало блока данных в .dbt-файле
или 10 пробелов, если поле мемо пусто |
Все |
| V | 10 | Variable | Переменная Bin/ASCII данных в .dbv-файле 4 Bin байтов - начало блока в мемо-файле 4 Bin байтов - размер блока 1 Bin байт - подтип данных 1 Bin байт - зарезервировано 0x1A(26) | FS |
| P | 10 | Picture | Binary данные в .ftp-файле структура такая же как и в Memo-типе | Fp |
| B | 10 | Binary | Binary данные в .dpt-файле структура такая же как и в Memo-типе | D5 |
| G | 10 | General | OLE-объекты структура такая же как и в Memo-типе | D5, Fp |
| 2 | 2 | short int | Binary int max +/- 32767 | FS |
| 4 | 4 | long int | Binary int max +/- 2147483647 | FS |
| 8 | 8 | double | Binary signed double IEEE | FS |
Завершает описание заголовка символ 0x0D(13)
Теперь уже можно сделать кое-какие вычисления. Например, определить
количество полей в DBF-файле.
Размер заголовка DBF-файла в байтах составляет:
32+32xN+1 байт, где N - количество полей.
Этот же размер можно извлечь из 8,9 байтов заголовка -
Сместившись на HeaderSize байт от начала файла, мы переходим к непосредственно
к самим записям, размер которых указан в 10,11 байтах заголовка -
RecordSize
, а их количество в 04..07 байтах -
RecordsCount
.
Следовательно количество полей равно:
N:=(HeaderSize-33)/32 байт.
Структура записи в DBF-файле более простая.
Структура записи в DBF-файле
Каждая запись имеет следующую структуру.
| № байта | Размер | Описание | Используется |
|---|---|---|---|
| 0 | 1 | Флаг удаления "*", иначе - пробел | Все |
| 1 | 1..n | Различные типы полей фиксированной длины без завершающих символов длина поля n определяется в 16 байте структуры описания поля. | Все |
Завершает DBF-файл символ 0x1A(26)
Таким образом, в общем случае запись - это строка символов (кроме FS), состоящая из частей (полей) строго определенного размера. Эти размеры указаны в структуре описания поля в 16-м байте.
ВЫВОДЫ
Теперь, изучив строение структуры DBF-файла мы можем:
Источник http://www.realcoding.net/