From: "Сергей Перевозник" <psv@pcb.chernigov.ua>
Subject: Описание формата файлов PARADOX
Date: 24 Oct 1997 06:27:30 GMT
Organization: ПОЛИКОМБАНК
Формат файла PARADOX
Составил : Сергей Перевозник
Дата - число дней с 31.12.0 - этому значению соответствует 80000000
Hex
текст - просто текст
Смещение пояснение
00 размер одной записи мл. байт
01 размер одной записи ст. байт
02 смещение конца заголовка мл. байт
03 смещение конца заголовка ст. байт
После этого адреса идут несколько байт 00
и начинаются данные. Данные выровнены по левому краю
поля, пустые места заполнены 00.
04
05 Значение этих двух байт всегда постоянно (по крайней
мере у меня так получилось) и равны 02 01 (H).
Может быть это версия Paradox (у меня 3.0).
06 число записей в файле мл. байт
07 число записей в файле ст. байт
08-09 Почему-то всегда 00.
A-B Часто бывает равно числу записей в файле.
(но почему-то не всегда, похоже это что-то другое)
C-D Часто бывает равно (A-B)+1.
21 число полей в записи.
__Описание полей.__
Таблица описания полей начинается со смещения 5A.
Поля описываются в формате:
КОД ТИПА РАЗМЕР (байт) КОД ТИПА РАЗМЕР (байт)
Код типа - указывает на тип поля.
Размер - задает размер поля в байтах.
Код типа поля:
01 - Alphanumeric
02 - Date
03 - Integer
05 - Currency
06 - Number
PS Если у кого есть дополнения и/или замечания - милости просим.
Файл данных Paradox (*.db) состоит из заголовка и набора страниц.
Страницы связаны в двусвязный список в соответствии с основным индек-
сом. Каждая страница хранит переменное число записей фиксированной
длины. Страница идентифицируется своим порядковым номером в файле дан-
ных. Под номер страницы зарезервировано одно слово.
1. Формат файла db:
Заголовок файла + Hабор страниц.
2. Формат страницы файла данных:
Type
tPage = record
NextPage : word;
PrevPage : word;
LastOfs : word;
Records : ....
end;
Поле LastOfs содержит смещение начала последней заполненной записи
на странице относительно поля Records ( для смещения относительно на-
чала страницы надо добавлять 3 слова ).
Поля NextPage и PrevPage содержат номера соответственно следующей и
предидущей страницы. Внутри страницы записи отсортированы по основному
индексу.
Свободные страницы внутри файла связаны в список с помощью полей
NextPage. Hомер первой свободной страницы хранится в заголовке.
Заголовок файла данных содержит служебную информацию о размере запи-
сей, размере страниц и.т.п. Кроме того он содержит информацию о полях
записи. Он состоит из общей части и набора описаний полей.
3. Формат общей части заголовка файла данных:
Type
tHeader = Record
hRecordSize : word; { размер записи в байтах }
hHeaderSize : word; { размер заголовка в байтах }
hPrimaryIdx : byte; { ??? связан с наличием основного индекса }
hPageSize : byte; { размер страницы в килобайтах }
hRecCount : longint; { количество записей в файле }
hPageCount : word; { количество страниц }
hFreePage : word; { номер первой свободной страницы, далее
Next...}
hTopPage : word; { первая страница в основном индексе }
hBottomPage : word; { последняя страница в основном индексе }
hReserved : array[1..15] of byte; { ??? для импорта не важны }
hFieldCount : word; { количество полей в записи }
end;
В версии Paradox 3.X описание полей начинается со смещения 58h.
В версии Paradox 4.X описание полей начинается со смещения 78h.
4. Формат описателя поля:
Type
tField = Record
FieldType : byte; { Тип поля см. ниже }
FieldSize : word; { Размер поля в байтах }
end;
Со смещения hFieldCount*6 + 83 от начала описателей полей хранится
список названий полей. В виде набора ASCIIZ строк. Hазвание может быть
длиной до 25 символов.
Типы полей:
1 - Alphanumeric { переменной длины }
2 - Date { 4 байта }
3 - Integer { 2 байта }
5 - Currency (Integer) { 2 байта }
6 - Double { 8 байт }
C - Memory
D - Binary
E - Formated memory Хранятся в Memo-файле
F - OLE object
10 - Graphic
Данные хранятся в следующем виде:
Alphanumeric - Массив символов дополненный до фиксированной длины
символом 0.
Типы со 2 по 6 хранятся в обратном порядке:
Integer - ст. байт, мл. байт
Double - 8, 7, 6, 5, 4, 3, 2, 1 - байт.
Числовые поля имеют инвертированый старший бит:
т.е. число 1234h хранится в виде 92 34.
|