+7 (916) 114-5109
+7 (916) 114-5109
с 10 до 22 (Москва)
с 10 до 22 (Москва)
Приветствую Вас Гость
Приветствую Вас Гость
Главная » Статьи » Вокруг XlsToDBF
Структура DBF-файла

Первые 32 байта (00..31) заголовка DBF-файла описывают глобальные параметры, относящиеся ко всей таблице. Непосредственно за этим описанием следуют определения полей. Ниже в двух таблицах подробно рассмотрена структура заголовка DBF-файла.


Смещение Описание
00 Версия dBASE:
  • 0x02 FoxBASE
  • 0x03 FoxBase plus/dBASE III plus (FoxPro 2.x) без MEMO
  • 0x30 Visual FoxPro
  • 0x31 Visual FoxPro (присутствует автоинкрементное поле)
  • 0x43 dBASE IV файлы SQL таблиц без MEMO
  • 0x63 dBASE IV системные файлы SQL таблиц без MEMO
  • 0x83 FoxBASE plus/dBASE III plus с MEMO
  • 0x8B dBASE IV с MEMO
  • 0xCB dBASE IV файлы SQL таблиц с MEMO
  • 0xF5 FoxPro 2.x (или меньше) с MEMO
01..03 Дата последнего изменения (ГГММДД).
04..07 Количество записей в файле.
08..09 Позиция (смещение) в файле первой записи данных.
10..11 Длина одной записи данных, включая байт признак удаления.
12..27 Зарезервировано 0x00.
28 Флаг:
  • 0x01 Файл индексируется (присутствует индексный файл .CDX)
  • 0x02 Файл содержит MEMO-поля
  • 0x04 Файл является базой данных .DBC

Этот байт может содержать комбинацию значений. Например, 0x03 означает, что таблица индексируется и содержит MEMO-поля.
29 CODEPAGE. Указывает в какой кодовой странице хранятся данные. Например, значение 0x65 указывает на CP DOS-866, а 0xC9 на WINDOWS-1251.
30..31 Зарезервировано 0x00.
32..nn Описание полей. Описание каждого поля занимает 32 байта (см. таблицу ниже).
nn+01 Признак завершения заголовка (0x0D).
nn+02..nn+264 263-байтная область, содержащая путь к базе данных (.DBC), в которую включён этот файл. Если первый байт 0x00, значит файл ни с какой базой данных не ассоциирован.

По адресу 0x0032 (см. предыдущую таблицу 32..nn) начинаются определения полей (колонок) таблицы. Каждое определение занимает 32 байта. В следующей таблице описывается структура определения одного поля. Все определения следуют одно за другим без каких-либо разделителей.


Смещение Описание
00..10 Наименование поля. Максимум 10 символов заканчивающихся 0x00. Если наименование меньше 10-ти символов, то свободные байты заполняются 0x00.
11 Тип поля:
  • C: Character
  • N: Numeric
  • F: Float
  • D: Date
  • L: Logical
  • M: Memo
  • G: General
  • C: Caracter (binary)
  • M: Memeo (binary)
  • B: Double
  • I: Integer
  • Y: Currency
  • T: DateTime
  • P: Picture

Надстройка XlsToDBF поддерживает только C, N, D, L.
12..15 Относительная позиция поля в записи.
16 Длина поля в байтах.
17 Количество знаков за запятой.
18 Флаг:
  • 0x01 Системное поле (невидимое для пользователя)
  • 0x02 Поле может содержать пустое значение (NULL)
  • 0x04 Бинарное поле (только для Character и Memo)
  • 0x06 (0x02+0x04) Когда поле пустое и бинарное (для Integer, Currency, Character, Memo)
  • 0x0C Автоинкрементное поле
19..22 Следующее значение автоинкрементного поля.
23 Шаг автоинкрементного поля.
21..31 Зарезервировано 0x00.

По адресу 0x0008 (см. первую таблицу 08..09) хранится адрес начала области самих записей с данными таблицы dBASE. Каждая запись начинается с байта признака удаления. Если первый байт записи содержит значение 0x20 (символ пробела), то запись считается рабочей (не удалённой) и при запросах выдаётся пользователю. Когда пользователь удаляет запись (или набор записей), то для экономии времени и повышения быстродействия запись физически не удаляется, она просто помечается как удалённая. В первый байт записи (признак удаления) записывается значение 0x2A (символ «звёздочка»). Чтобы избавиться от записей, помеченных на удаление, нужно сделать паковку таблицы. Для этого, например, в среде FoxPro или Visual FoxPro существует команда PACK. Эта команда удаляет записи, помеченные «звёздочкой», физически. После этой процедуры файл становится меньше, отсюда и название: паковка.

В конце файла за последней записью данных записывается ещё один байт — байт завершения файла, его значение всегда 0x1A. Всегда, да не всегда... На следующих двух рисунках отображены два файла с одними и теми же данными открытые в HexEdit (шестнадцатеричный редактор). Посмотрите внимательно и сравните.

HEXEdit FoxPro 2.x
Рис. 1 — Пример DBF-файла в формате FoxPro 2.x
HEXEdit Visual FoxPro 9
Рис. 2 — Пример DBF-файла в формате Visual FoxPro 9

Два основных отличия:

  • 263-х байтный блок у FoxPro 2.x dBase III просто отсутствует
  • в Visual FoxPro 9 отсутствует байт завершения файла 0x1A

Ну действительно, зачем в FoxPro 2.x 263-х байтный блок, если FoxPro не поддерживает базу данных. В FoxPro 2.x этот блок всегда будет пустым. Хотя его можно организовать и всё прекрасно будет работать. Главное чтобы позиция первой записи данных была правильно определена — байты 08..09 в заголовке. Обратите внимание смещение позиции первой записи записано как бы «задом наперёд». Например, если первая запись начинается со смещения 0x01A8, то в заголовке в ячейках 08..09 сначала записан старший байт значения 0xA8, а потом младший — 0x01 (на рис 2. в этом можно убедиться). Почему? Это уже другая тема. Так исторически сложилось. (Если интересно, обратитесь к какому-нибудь пособию по ASSEMBLER, например, есть очень хорошая книга Питера Абеля «Язык Ассемблера для IBM PC и программирования». Прочитав первые две главы, я уверен, всё встанет на свои места!)

А вот почему у Visual FoxPro отсутствует завершающий байт 0x1A, честно говоря, мне не понятно. Узнал об этом чисто случайно. Причём, если его установить принудительно, Visual FoxPro сочтёт это ошибкой и не откроет такой файл. Так что в Visual FoxPro последний байт в файле — суть последний байт последней записи данных. Вот собственно и всё! Ниже показано как Visual FoxPro 9 отображает эти два примера в режиме BROWSE.

HEXEdit Visual FoxPro 9
Рис. 3 — Окно VFP 9 в режиме BROWSE

Чёрный маркер (прямоугольник) слева на второй записи означает, что запись помечена на удаление. Посмотрите на рис. 2 по адресу 0x01DB установлена «звёздочка» (значение 0x2A). На рис. 1 та же запись начинается по адресу 0x00D4.

Автор: Василий Малинин | Добавил: basile-m | Просмотров: 3337 | Всего комментариев: 0

Добавлять комментарии могут только зарегистрированные пользователи с подтверждённым E-Mail адресом.
Онлайн всего: 1
Гостей: 1
Пользователей: 0

Мастерская Василия Малинина

Copyright Basile's Soft © 2024

Конструктор сайтов - uCoz

basile-m@yandex.ru