как можно вытащить пароль на базу данных работающую через прогу?

Тема в разделе "WASM.RESEARCH", создана пользователем test4me, 4 ноя 2010.

  1. test4me

    test4me New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    19
    Зря ты так называешь его древним..там 2 формата (DAT и TPS), да на DAT формат можно найти кучу всего, но формат TPS не прост и его структура очень малоизвестна, я уже не говорю как вообще с этой базой работать в SQL очень мало данных..и хранение данных там организованно совсем подругому чем в других очень известных БД..а чем менее известна БД тем она загадочнее и почти неломаемая..ну приведи хоть одну ссылку мне где написано о TPS преобразовании в любой формат, хоть в аксесс..думаю не найдешь, а если и есть такая, то без пароля никак понимаешь..да согласен что древняя..это еще с того времени когда были Dbase III, Dbase IV и Clipper..но с тех пор там наворотили много чего а инфы почти нет...спасибо за участие!
     
  2. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    test4me
    Так же, как и с любой другой доисторической БД - через ODBC-драйвер. Драйвер есть тут. Про снятие пароля - вот.

    Этот пароль существует только для программы, работающей с БД. Сама база не шифруется пользовательским паролем по вполне очевидной причине: пользователей может быть много, и пароли у всех наверняка разные. Базы даже 10 Оракуле хранятся в открытом виде, формат хранения не слишком тривиальный, но при желании можно прочитать одним лишь шестнадцатиричным редактором.

    Ну и, наконец, супербанальный вопрос: а снять скриншот со всей таблицы SnagIt'ом и зарядить в распознавалку текстов - такой способ не пройдёт?
     
  3. test4me

    test4me New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    19
    Да я знаю эту ссылку..спасибо!
    Так вот и в том дело что нет у меня этого словарного файла (DCT) как ни странно, тогда и не было бы разговора вообще об этом..

    Даже TopScan без пароля бессилен...Это всеравно что попросить разработчика выслать ему сорцы..)))))
     
  4. test4me

    test4me New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    19
    вот нарыл в инете про структуру TPS файла, но самому не осилить к сожалению, может кто подскажет посмотрев на это:
    Код (Text):
    1.                        О С Н О В Н О Й   T P S - Ф А Й Л
    2.  
    3.                              ФИЗИЧЕСКАЯ ОРГАНИЗАЦИЯ
    4.  
    5.                                     Заголовок
    6.  
    7.       (+0)       (+4)          (+6)           (+0Ah)          (+0Eh)
    8.   00 00 00 00    00 00      00 05 00 00     00 05 00 00     74 4F 70 53
    9.  UNSIGNED LONG   USHORT    UNSIGNED LONG   UNSIGNED LONG   UNSIGNED LONG
    10.    Смещение      Размер     Длина файла     Длина файла     Метка файла
    11.   заголовка    заголовка                                      TOPSPEED
    12.  
    13.   (+12h)      (+14h)          (+18h)                (+1Ch)
    14.   00 00     00 00 00 06     07 00 00 00           00 00 00 00
    15.   SHORT    UNSIGNED LONG   UNSIGNED LONG         UNSIGNED LONG
    16.    Нули      Последний   Счетчик изменений     Верхняя управляющая
    17.    (?)         номер           файла        страница (адрес минус 200h,
    18.                                                 деленный на 100h)
    19.  
    20.  
    21.   Далее следуют 2 массива длиной (длина_заголовка-20h)/2 четырехбайтовых
    22. чисел (ниже порядок байт перевернут):
    23.  
    24. 0020h:   00000000  00000000  01000000  04000000  4D000000  22010000  22010000
    25.  
    26.  
    27. 0110h:   00000000  01000000  03000000  4C000000  22010000  22010000  22010000
    28.  
    29.             ^                                                 ^
    30.    эта пара элементов                          это (длина_файла-200h)/100h,
    31.       игнорируется (?)              эта пара чисел заполняет остаток массивов
    32.  
    33.   В файле страницы идут блоками, между которыми простанство не используется.
    34. i-й элемент в первом массиве показывает начало каждого такого блока, i-й
    35. элемент во втором - конец блока. i-й элемент - это смещение блока (первого
    36. байта в первой странице для первого массива и первого байта следующей за по-
    37. следней страницей страницы в блоке для второго массива) минус 200h (размер
    38. заголовка), деленное на 100h. Все страницы в блоке, кроме, быть может,
    39. последней, сжаты, если могут быть сжаты.
    40.   Если какая-то страница в середине блока не сжата, но может быть сжата, то
    41. блок разбивается на два так, чтобы несжатая страница была в конце блока. В этих
    42. массивах тогда встречается конструкция вида (в примере ниже несжатая страница
    43. находится по смещению 0200h и имеет размер 100h):
    44.  
    45. 0020h:   00000000    00000000    01000000
    46.  
    47. 0110h:   00000000    01000000    22010000
    48.                          ^           ^
    49.  
    50.   В конце файла не может быть неиспользуемого пространства. Если оно по-
    51. является, то файл укорачивается (обрезается функцией int 21h, ah=40h, cx=0).
    52.   Неизвестно, может ли заголовок быть длиннее 200h, и если да, то что
    53. происходит с этими массивами (скорее всего, их длина просто увеличивается).
    54.  
    55.  
    56.                            Формат обычной страницы
    57.  
    58.    (+0)                   (+4)                  (+6)             (+8)
    59.    00 02 00 00            73 00                 77 00            7F 00
    60.      ULONG                USHORT                USHORT           USHORT
    61.     Смещение          Длина сжатой         Длина страницы    Длина страницы
    62.     страницы     страницы (если страница     после деком-   после декомпрес-
    63.  (для контроля)   не сжата, то здесь по-        прессии       сии безо всех
    64.                  вторяется следуещее поле)                      сокращений
    65.  
    66.     (+0Ah)             (+0Ch)                      (+0Dh)
    67.     0A 00                00                          05
    68.     USHORT              BYTE                        BYTE
    69.  Число записей    Признак обычной   Смещение первого блока-повторителя
    70.   на странице         страницы            Этот байт есть только когда
    71.                  (уровень страницы)             страница сжата,
    72.                                             т.е. поле по смещению 4 не
    73.                                             равно полю по смещению 6
    74.     (+0Dh/0Eh)
    75.     ...
    76.     Далее идут записи на странице
    77.  
    78.   Страницы в файле имеют разную длину. Длина конкретной страницы зависит от
    79. файлового драйвера. Если при добавлении/изменении данных оказывается, что
    80. страницы слишком длинная, она разделяется на две.
    81.   За страницей неиспользуемое пространство до следующего кратного 0x100
    82. смещения заполяется байтом 0xB0 и не входит в длину страницы (поля +4, +6, +8),
    83. но резеврируется за ней и в заголовке указывается принадлежащим странице.
    84.  
    85.  
    86.                           Формат управляющей страницы
    87.  
    88.    (+0)                    (+4)                (+6)             (+8)
    89.    00 02 00 00             73 00               77 00            7F 00
    90.      ULONG                 USHORT              USHORT           USHORT
    91.     Смещение           Длина страницы       Длина страницы    Длина страницы
    92.     страницы           с сокращениями       с сокращениями         без
    93.  (для контроля)                                                 сокращений
    94.  
    95.  
    96.     (+0Ah)             (+0Ch)
    97.     0A 00                00
    98.     USHORT              BYTE                 Байта по смещению +0Dh
    99.  Число записей    Уровень управляющей        нет, т.к. управляющие страницы
    100.   на странице          страницы              не сжимаются (?)
    101.                  (0-обычная страница)
    102.  
    103.     (+0Dh)
    104.   00 00 00 00    05 00 00 00    ...
    105.      ULONG          ULONG
    106.   Массив подчиненных страниц. Его размер равен числу записей на упр.странице.
    107.   Элемент массива - это (смещение_подчиненной_страницы-200h)/100h.
    108.  
    109.     (+?)
    110.     ...
    111.   Далее следуют записи. Они повторяют первые записи на подчиненных страницах
    112. (возможно укороченные, если подчиненные страницы не управляющие).
    113. Каждой этой записи соответствует элемент в массиве подчиненных страниц.
    114.  
    115.  
    116.                                  Сжатые страницы
    117.  
    118.   Если страница сжатая, то поля (+4) и (+6) заголовка страницы различаются.
    119. В этом случае байт по смещению (+0Dh) показывает смещение относительно
    120. байта (+Eh) первого блока-повторителя. Формат этого блока:
    121.  
    122.           00                  05                       03
    123.          BYTE                BYTE                     BYTE
    124.       Какой байт        Кол-во повторений     Смещение следующего
    125.    нужно повторять         минус одно          блока-повторителя
    126.  
    127.   Смещение следующего блока-повторителя - это смещение следующего такого блока
    128. относительно байта, последнего в этом блоке. Если блок - последний, то смещение
    129. следующего блока указывает на последний байт страницы (не на следующий за
    130. страницей байт 0xB0).
    131.   Если количество повторений > 127, то непосредственно за этим байтом следует
    132. еще один:
    133.  
    134.         3E              85           10                 03
    135.        BYTE            BYTE         BYTE               BYTE
    136.     Какой байт     Первый байт   Второй байт    Смещение следующего
    137.     повторять     Кол-во повторений минус одно         блока
    138.  
    139.   Кол-во повторений тогда вычисляется по формуле
    140.  
    141.             ((второй_байт + ((первый_байт & 7F) << 1)) >> 1) + 1
    142.  
    143.   Если смещение_следующего_блока > 127, то непосредственно за этим байтом
    144. следует еще один байт, смещение относительно последнего байта блока при этом
    145. вычисляется по формуле
    146.  
    147.                (второй_байт + ((первый_байт & 7F) << 1)) >> 1
    148.  
    149.   Заголовок страницы не сжимается. Нормальное состояние страниц - сжатое.
    150. Однако страница не сжимается, если не может быть сжата, т.е.после сжатия ее
    151. длина должна быть строго меньше несжатой. Если страница не сжата, но может
    152. быть сжата, то она указывается в заголовке. Если страница не может быть сжата,
    153. то она в заголовке не указывается.
    154.  
    155.  
    156.                           Общий формат записи на странице
    157.  
    158.       (+0)            (+1)          (+1/3)          (+1/3/5)
    159.        С0             2A 00          09 00           . . .
    160.   Идентификатор    Новая длина    Новая длина
    161.                      записи        записи в          Данные
    162.                                  управляющей
    163.                                    странице
    164.  
    165.    Формат идентификатора:        1 1 0 0 0 1 0 0
    166.                                  │ │ L----T-----
    167.     указана новая длина записи --- │      │
    168.                                    │    сколько первых байт этой
    169.     указана новая длина записи -----    записи должно быть взято
    170.     в управляющей странице              из предыдущей записи
    171.  
    172.   Длина новой записи присутствует только тогда, когда идентификатор & 0x80<>0,
    173. в противном случае эначение длины берется из предыдущей записи. Длина новой
    174. записи в управляющей странице присутствует только тогда, когда
    175. идентификатор & 0x40 <> 0, в противном случае берется из предыдущей записи.
    176. Для первой записи на странице эти оба значения должны быть обязательно указаны,
    177. т.е. должно выполняться идентификатор & 0xC0 = 0xC0. Шесть младших битов иден-
    178. тификатора показывают количество копируемых из предыдущей записи байтов.
    179.  
    180.  
    181.                                Общий формат файла
    182.  
    183.  ---- Заголовок ------┐  ---->--- Блок 1
    184.  │ ...                │  │    │-- страница 1
    185.  │  верхняя страница  │  │    ││  .....--
    186.  │ ...                │  │    │L-
    187.  │                    │  │    │-- страница 2
    188.  │ 020h:  00 00 00 00 │  │    ││  ...........------
    189.  │        начало1 --------    │L-
    190.  │        начало2 ---------┐  │...
    191.  │        начало3 -------┐ │  │-- страница M
    192.  │        ...         │  │ │  ││  ..........---
    193.  │ 110h:  00 00 00 00 │  │ │  │L-
    194.  │        конец1 --------+-+->L----
    195.  │        конец2 --------+ │   неиспользуемое пространство
    196.  │        конец3 ------┐ │ L->--- Блок 2
    197.  │        ...         ││ │    │-- страница 1
    198.  L---------------------│ │    ││  ...
    199.                        │ │    │L-
    200.                        │ │    │-- страница 2
    201.                        │ │    ││  ...
    202.                        │ │    │L-
    203.                        │ │    │...
    204.                        │ │    │-- страница N - незаархивированная
    205.                        │ │    ││  ...
    206.                        │ │    │L-
    207.                        │ │    L----
    208.                        │ L--->--- Блок 3
    209.                        │      │-- страница 1
    210.                        │      ││ ...
    211.                        │      │L-
    212.                        │      │...
    213.                        │      │-- страница K
    214.                        │      ││ ...
    215.                        │      │L-
    216.                        │      L----
    217.                        L-----> неиспользуемое пространство
    218.                               --- Блок L
    219.                               ...
    220.  
    221.                               L----
    222.                               Конец файла
    223.  
    224.    -- Заголовок ----------------┐
    225.    │  . . . . . . . . . . . .   │
    226.  ---< страница верхнего уровня  │
    227.  │ │  . . . . . . . . . . . .   │
    228.  │ L-----------------------------
    229.  │
    230.  │     Страница
    231.  │     уровня N                   Страницы
    232.  L->T-----------------┐           уровня N-1                   Страницы
    233.     │ подчинен.стр.11-------->T-------------------┐         нулевого уровня
    234.     │ подчинен.стр.12------┐  │ подч.стр.21--------->...->--------------------┐
    235.     │ ...             │    │  │ подч.стр.22       │     --->записьN1=запись11 │
    236.     │                 │    │  │ ...               │     │ │ записьN2          │
    237.     │-----------------│    │  │                   │     │ │ ...               │
    238.     │ запись11 ------------+-┐│-------------------│     │ L--------------------
    239.     │ запись12 -----------┐│ L->запись21=запись11 ------- ...
    240.     │ ...             │   ││  │ запись22          │
    241.     L------------------   ││  │ ...               │  ...->--------------------┐
    242.                           ││  L--------------------       ->записьM1          │
    243.                           ││                              │ записьM2          │
    244.                           │L->--------------------┐       │                   │
    245.                           │   │ подч.стр.31--------->...  L--------------------
    246.                           │   │ ...               │       ...
    247.                           │   │-------------------│  ...->--------------------┐
    248.                           L---->запись31=запись12---------->записьK1          │
    249.                               │ ...               │       │ записьK2          │
    250.                               L--------------------       │ ...               │
    251.                               ...                         L--------------------
    252.                                                           ...
    253.  
    254.   Все записи отсортированы в лексикографическом порядке.
    255.   Все записи в файле отсортированы в лексикографическом порядке. Это
    256. достигается тем, что на каждой странице записи отсортированы, в том числе и на
    257. управляющих. На управляющих страницах записи повторяют первые записи на
    258. соответствующих подчиненных страницах (или несколько укороченные). Физическая
    259. организация TPS-файла сильно похожа на организацию ключевых/индексных файлов
    260. формата CLARION 2.1.
    261.   Замечание: судя по всему, в файле (и на каждой странице) не должно быть двух
    262. одинаковых записей (см.записи ключей/индексов и атрибут DUP).
    263.  
    264.   При поиске записи проходится цепочка страниц от верхней управляющей до
    265. страницы нулевого уровня, по одной странице из каждого уровня. На странице
    266. поиск начинается от начала страницы: ищется последняя запись, которая лексико-
    267. графически меньше искомой. Дальше для найденной записи и для каждой записи,
    268. N первых символов которой совпадают с искомой (N - длина искомой записи),
    269. запись ищется на подчиненной странице (или считается найденной, если это
    270. страница нулевого уровня). Если первая запись на странице лексикографически
    271. больше искомой, то на этой странице и на подчиненных искомой записи нет. Если
    272. на странице нулевого уровня первая запись меньше искомой, а после последней
    273. записи, N первых символов которой меньше искомой, сразу идет запись, которая
    274. лексикографически больше искомой, то на этой странице и во всем файле искомой
    275. записи нет.
    276.   При добавлении новой записи в файл проходится цепочка страниц длиной M, где
    277. M - уровень верхней управляющей страницы, и определяется место, куда поместить
    278. новую запись, чтобы она не нарушала порядка сортировки.
    279.  
    280.  
    281.                         ЛОГИЧЕСКАЯ ОРГАНИЗАЦИЯ БАЗ ДАННЫХ
    282.  
    283.   TPS-файл может содержать несколько таблиц данных и для каждой таблицы
    284. данные, ключи/индексы и memo-поля.
    285.  
    286.                               Типы и форматы записей
    287.  
    288.   00-F2   - ключи/индексы
    289.   F3      - запись базы данных
    290.   F6      - информационная запись, содержит число записей конкретного типа
    291.   FA      - описание таблицы
    292.   FC      - данные memo-полей
    293.  
    294.                                    Пустая запись
    295.  
    296.   Первой записью в файле всегда идет пустая запись:  C0 00 00 00 00
    297.  
    298.                                  Запись базы данных
    299.  
    300.                                                   (+0)            (+4)
    301.      C0           3F 00         09 00          00 00 00 01         F3
    302.     BYTE          USHORT        USHORT            ULONG           BYTE
    303.  Идентификатор    Длина      Длина записи    Номер таблицы     Код записи -
    304.                  записи+9   в упр.странице,                     запись БД
    305.                             всегда равна 9
    306.  
    307.         (+5)           (+9)
    308.      00 00 00 1B       ...
    309.         ULONG
    310.     Номер записи,     Данные
    311.   уникальное число
    312.   для каждой записи
    313.  
    314.   При добавлении новой записи номер последней записи в заголовке файла увеличи-
    315. вается на единицу (последний байт увеличивается первым, как в процессорах
    316. Motorola), а затем присваивается новой записи. Таким образом достигается
    317. уникальность. При физическом создании файла DOS номер последней записи
    318. устанавливается в 1 (в формате Motorola).
    319.   Длина записи в упр.странице - всегда 9.
    320.  
    321.                              Запись ключа/индекса
    322.  
    323.                                         (+0)                 (+4)
    324.       C0          19 00     19 00    00 00 00 01              01
    325.      BYTE         USHORT    USHORT      ULONG                BYTE
    326.  Идентификатор                      Номер таблицы   Код записи, одновременно
    327.                                                      порядковый номер ключа
    328.  
    329.        (+5)                    (+?)
    330.    80 02 80 05 05  ...     00 00 00 1B
    331.                                ULONG
    332.       Данные              Номер записи БД
    333.  
    334.   Сортировка в ключе/индексе производится благодаря обязательной сортировке
    335. всех записей в файле. Длина этой записи в управляющей странице равна длина
    336. записи в обычной странице, если ключ имеет атрибут DUP, и меньше ее на 4 в
    337. противном случае (очевидно, в TPS-файле не должно быть двух одинаковых
    338. записей).
    339.   Замечание: если номер записи в индексе ссылается на несуществующую запись БД
    340. (если его исправить вручную), то при следующих построениях индекса Clarion
    341. Database Manager'ом она иногда удалена не будет (почему?).
    342.  
    343.                                 Запись memo-поля
    344.  
    345.                             (+0)           (+4)             (+5)
    346.   C0   0C 01    0C 00    00 00 00 01        FC           00 00 00 02
    347.  BYTE  USHORT   USHORT      ULONG          BYTE             ULONG
    348.                       Номер таблицы   Код записи -     Номер записи БД,
    349.                                        данные memo    к которой относится
    350.                                                          это memo-поле
    351.  
    352.           (+9)                  (+0Ah)               (+0Ch)
    353.            00                    00 01                ...
    354.           BYTE                   USHORT
    355.      Порядковый номер       Номер блока memo,      Данные memo-поля
    356.         memo-поля          посл.байт изменяется
    357.    (у записи может быть          первым
    358.  больше одного memo-поля)
    359.  
    360.   Данные memo следуют блоками по 256 байт (в последнем блоке может быть меньше)
    361. Номер блока указывается в поле (+0Ah) (последний байт которого изменяется
    362. первым). Длина этой записи в упр.странице - всегда 12.
    363.  
    364.                                Информационная запись
    365.  
    366.                             (+0)           (+4)               (+5)
    367.   C0   0E 00   06 00    00 00 00 01         F6                 01
    368.  BYTE  USHORT  USHORT      ULONG           BYTE               BYTE
    369.                        Номер таблицы    Код записи -   Код записей, к которым
    370.                                        информационная   относится информация:
    371.                                            запись        00-F2 - ключи/индексы
    372.                                                          F3    - данные
    373.  
    374.         (+6)               (+0Ah)
    375.     05 00 00 00         00 00 00 00
    376.        ULONG                ULONG
    377.    Число записей      Запись, к которой
    378.    с этим кодом        было обращение
    379.  
    380.   По одной записи этого типа создается для каждого ключа/индекса и для данных
    381. таблицы. Код записей, для которых создается эта запись, указывается в поле по
    382. смещению +5. Длина этой записи в упр.странице - всегда 6.
    383.   Запись, к которой было обращение, равна 0, если индекс не требует перестро-
    384. ения, и содержит номер записи БД, к которой первый раз обратились после
    385. последнего перестроения индекса. Всегда равно 0 для ключей и данных таблицы.
    386.  
    387.                            Описание структуры таблицы
    388.  
    389.                             (+0)         (+4)        (+5)         (+7)
    390.   C0   1A 00   07 00    00 00 00 01       FA         00 00        01 00
    391.  BYTE  USHORT  USHORT      ULONG         BYTE        USHORT       USHORT
    392.                        Номер таблицы  Код записи -   Номер      Минимальная
    393.                                        описание      блока    версия драйвера
    394.                                        структуры    описания    для работы
    395.  
    396.   3F 00      07 00    01 00    07 00
    397.   USHORT     USHORT   USHORT   USHORT
    398.    Длина     Число    Число    Число
    399.   записи в   полей     memo    ключей/
    400.   таблице                     индексов
    401.  
    402.   Данные описания структуры следуют блоками по 512 байт (в последнем блоке
    403. может быть меньше) (аналогично memo). Номер блока указывается в поле (+5).
    404. Длина каждой такой записи в упр.странице - всегда 7. В поле (+7) стоит
    405. минимальная версия драйвера для работы с файлом:
    406.   1 = TopSpeed 1.0 из пакета Clarion 3.1
    407.   2 = TopSpeed из пакета Clarion for Window 1.5
    408.  
    409.   Описание полей
    410.   --------------
    411.  
    412.    (+0)          (+1)           (+3)         (+n)           (+n+2)
    413.     12          00 00         FIELD1 00      01 00          14 00
    414.    BYTE         USHORT         CSTRING       SHORT          SHORT
    415.    Тип       Смещение поля     Название   Число эл-тов   Длина всего
    416.    поля     от начала записи     поля       в массиве      массива
    417.  
    418.          (+n+4)               (+n+6)
    419.          00 00                01 00
    420.          USHORT               USHORT
    421.             ?               Порядковый
    422.   равно 1, если это поле   номер поля
    423.     перекрывает другое      в записи
    424.     поле (атрибут OVER)
    425.   равно 0 в пр.случае
    426.  
    427.   Поле (+n) содержит 1, если это поле не массив, размерность для одномерного
    428. массива и произведение размерностей для многомерного размера. Следующее поле
    429. содержит размер всего массива, т.е.размер одного эл-та, умноженный на содер-
    430. жимое поля (+n+2).
    431.   Если файл имеет префикс, то он указывается в каждом имени поля, например:
    432. "TST:FIELD1". Если префикса нет, то пишется просто "FIELD1". Префикс полей
    433. никак не учитывается после создания.
    434.   Замечание: если в поле (+n+4) поместить любое не равное 0 значение, то это
    435. будет действовать также, как и единица. Однако стандартные средства помещают 1.
    436.  
    437.   Типы полей
    438.   ----------
    439.  
    440.  Тип  Размер   Название    Описание
    441.  ---  ------   --------    --------
    442.   01     1      BYTE       число без знака
    443.   02     2      SHORT      число со знаком в формате Intel 8086
    444.   03     2      USHORT     SHORT без знака
    445.   06     4      LONG       число со знаком в формате Intel 8086
    446.   07     4      ULONG      LONG без знака
    447.   08     4      SREAL      формат single сопроцессора Intel 8087
    448.   09     8      REAL       формат double сопроцессора Intel 8087
    449.  
    450.   0A     ?      DECIMAL    дополнительные данные:
    451.  
    452.                                    (+n+8)                (+n+9)
    453.                                      02                    05
    454.                                     BYTE                  BYTE
    455.                                  Число знаков         Длина одного
    456.                               после десятич.точки   элемента массива
    457.  
    458.   DECIMAL - это число с фиксированной точкой в формате BCD, один байт содержит
    459.   две цифры, старший ниббл старшего байта содержит знак (0-плюс, другое-минус).
    460.   Замечание: Clarion записывает в качестве минуса 0xF. Старший байт хранится
    461.   первым (с наименьшим смещением). Размер данных вычисляется по формуле:
    462.       (число_знаков_до_точки + число_знаков_после_точки)/2 + 1
    463.   Максимальная длина - 16 байт.
    464.  
    465.   12     ?      STRING      дополнительные данные:
    466.  
    467.                                (+n+8)        (+n+10)
    468.                                14 00          00 00
    469.                                USHORT           ?
    470.                              Длина одного     Шаблон
    471.                              эл-та массива    picture
    472.  
    473.        Если описываемое поле - массив, то (+n+8) - длина одного его элемента.
    474.        Если строка имеет шаблон, то он должен быть указан в поле (+n+10), без
    475.        знака @ и завершающийся одним нулем. Если шаблона нет, то поле (+n+10)
    476.        содержит 2 байта: первый - нуль, второй - любое число (Clarion 3.1
    477.        записывает 0). Почему два байта - непонятно.
    478.  
    479.   12     ?      PICTURE     дополнительные данные:
    480.  
    481.                                (+n+8)           (+n+10)
    482.                                09 00         p####-####p 00
    483.                                USHORT            CSTRING
    484.                              Длина одного        picture
    485.                              эл-та массива
    486.  
    487.   13     ?      CSTRING     дополнительные данные: см. STRING или PICTURE
    488.                             CSTRING - строка, заканчивающаяся нулем.
    489.  
    490.   14     ?      PSTRING     дополнительные данные: см. STRING или PICTURE
    491.                             PSTRING - строка, первый байт которой - длина
    492.                             Размер поля PSTRING - макс.длина строки плюс 1.
    493.  
    494.   16     ?      GROUP       дополнительных данных нет
    495.  
    496.       GROUP представляется как независимое от вложенных в него полей поле.
    497.     Оно просто перекрывает другие поля (с помощью указания смещения и размера).
    498.     Номер ему присваивается также, как и другим полям, независимо от других
    499.     полей. Располагается непосредственно перед подчиненными полями, которые
    500.     следуют за ним. Номера подчиненным полям присваюваются, как будто они не
    501.     входят в GROUP. Если группа имеет префикс, это указывается в названии
    502.     подчиненных полей и замещает префикс файла, например: "GRP:FIRST_FIELD".
    503.     Если группа не имеет префикса, на ее поля имеют тот же префикс, что у
    504.     основного файла. Если и у основного файла нет префикса, то ее поля не
    505.     имеют никакого префикса. Префикс полей группы никак не учитывается после
    506.     создания.
    507.       При создании массива GROUP размерность его указывается в поле (+n) в
    508.     описании поля GROUP. Больше ссылок на то, что это массив, нет. Для
    509.     подчиненных элементов смещение указывается как для первого элемента
    510.     массива. Подчиненное поле из первого элемента массива может даже входить
    511.     в ключ.
    512.  
    513.   Описание memo
    514.   -------------
    515.  
    516.          (+0)               (+n)          (+m)        (+m+2)
    517.       DATA.MEM 00       FILE_MEMO 00      10 27       01 00
    518.         CSTRING            CSTRING        USHORT      USHORT
    519.    Название внешнего      Название         Длина     Атрибуты
    520.     файла для memo        memo-поля      memo-поля
    521.  
    522.   Если есть имя внешнего файла (external name), то оно записывается в поле (+0)
    523. и завершается одним нулем. Если имя внешнего файла отсутствует, то поле (+0)
    524. содержит 2 байта: первый из них - нуль, второй - любой (Clarion 3.1 пишет 1).
    525. Пример:
    526.  
    527.           (+0)          (+n)          (+m)     (+m+2)
    528.          00 01      FILE_MEMO 00      10 27     01 00
    529.  
    530.   Замечание: в поле (+m+2) программой, написанной на Clarion 3.1, записывается
    531. значение 1, если memo-поле не имеет атрибута BINARY, и 2, если имеет. Clarion
    532. Database Manager 3.1 пишет сюда всегда 1. Это поле ни программой, ни Database
    533. Manager'ом не распознается (здесь может быть любое значение).
    534.   Для версии драйвера 2 (Clarion for Windows 1.5) байт атрибутов представляется
    535. так:
    536.         0 0 0 0 0 1 0 1
    537.                   │ │ L-- всегда 1
    538.                   │ L---- 1 = есть атрибут BINARY
    539.                   L------ 1 = это BLOB, 0 = это MEMO
    540.  
    541.   Для BLOB длина memo-поля равна 0.
    542.  
    543. Замечание: при импорте структуры файла CfW 1.5 нигде не учитывает байт
    544.            атрибутов.
    545.  
    546.   Описание ключа/индекса
    547.   ----------------------
    548.  
    549.    (+0)       (+n)      (+m)    (+m+1)        г============================┐
    550.    00 01     KEY1 00     21     02 00         │     АТРИБУТЫ KEY/INDEX     │
    551.      ?       CSTRING    BYTE    USHORT        │                            │
    552.  Название   Название  Атрибуты  Число         │      0 0 1 0 0 0 0 1       │
    553.  внешнего     ключа             полей         │        L-+     │ │ L- DUP  │
    554.   файла,                        в ключе       │  0 = KEY       │ L--- OPT  │
    555.  см.memo                                      │  1 = INDEX     L-- NOCASE  │
    556.                                               │  2 = Dynamic index         │
    557.   Дальше для кажного поля в ключе/индексе     L============================-
    558.   следует запись
    559.  
    560.     01 00     00 00
    561.     USHORT    USHORT
    562.      Номер   Атрибуты        Атрибуты:  0    = ASCENDING
    563.      поля                               не 0 = DESCENDING
    564.  
    565.   Для Dynamic index число полей всегда 0. Неизвестно, где хранятся данные
    566. Dynamic index. Если атрибуты - не 0 (совершенно любое число), то поле считается
    567. DESCENDING.
    568.   Замечание: если в поле (+0) содержится 00 00, то Clarion 3.1 при импорте
    569. структуры считает, что у ключа/индекса есть внешнее имя "". Другие значения
    570. второго байта (00 02, 00 03 и т.д.) распознаются правильно. У memo-полей
    571. значение 00 00 распознается правильно.
    572.  
    573.                                Название таблицы
    574.  
    575.   Последними записями в файле идут названия таблиц
    576.  
    577.                                (+0)            (+1)         (+n)
    578.   C0   0C 00   08 00            FE            UNNAMED    00 00 00 01
    579.  BYTE  USHORT  USHORT          BYTE            STRING       ULONG
    580.        Длина   Длина       Показывает, что    Название    Код файла
    581.        записи  записи       это название      таблицы     для этой
    582.                в упр.         таблицы                      таблицы
    583.               странице
    584.  
    585.   Байт по смещению (+0) показывает, что эта запись - название таблицы. Этим
    586. байтом не должен начинаться ни один номер таблицы. Отчасти поэтому при
    587. увеличении номера записи последний байт изменяется первым. Длина названия
    588. таблицы вычисляется как длина_записи минус 5, а длина записи в упр.странице -
    589. как длина_записи минус 4.
    590.   При создании таблицы функцией CREATE ее номер вычисляется как номер следующей
    591. записи (берется номер последней записи из заголовка, увеличивается на 1,
    592. записывается обратно в заголовок и считается номером таблицы).
    593.  
    594.  
    595.                    Представление полей в ключах и индексах
    596.  
    597.   ASCENDING
    598.  
    599.       BYTE, STRING,      Не меняются, GROUP рассматривается как STRING, даже
    600.       PICTURE, GROUP     байты у входящих в нее чисел не переставляются.
    601.  
    602.       CSTRING            Неиспользуемые байты с правого края забиваются нулями.
    603.  
    604.       PSTRING            Байт длины не указывается, неиспользуемые символы
    605.                          с правого края забиваются нулями, добавляется еще один
    606.                          нуль с правого края, чтобы длина строки в ключе была
    607.                          равна длине строки в записи таблицы.
    608.  
    609.       USHORT, ULONG      Байты переставляются задом наперед
    610.  
    611.       SHORT, LONG        Старший бит старшего байта инвертируется, байты
    612.                          переставляются
    613.  
    614.       REAL, SREAL        Если число положительное, то старший бит старшего
    615.                          байта инвертируется. В противном случае все биты
    616.                          инвертируются. Байты переставляются.
    617.  
    618.       DECIMAL            Если число положительное, то старший бит старшего
    619.                          байта инвертируется. В противном случае старший ниббл
    620.                          становится равным 7, и инвертируются все остальные
    621.                          биты
    622.  
    623.   DESCENDING
    624.  
    625.       BYTE, SHORT, LONG, USHORT, ULONG, REAL, SREAL, STRING, CSTRING,
    626.       PSTRING, DECIMAL   То же, что и ACSENDING, только каждый бит
    627.                          инвертируется
    628.  
    629.       Замечание: если число DECIMAL отрицательное, то старший ниббл равен
    630.                  8, остальные биты остаются без изменения. Фактически меняем
    631.                  знак числа, а дальше строим как для ASCENDING.
    632.       Замечание: если число REAL/SREAL отрицательное, то просто переставляются
    633.                  байты. Фактически меняем знак числа, а дальше строим как для
    634.                  ASCENDING.
    635.  
    636.  
    637.                                  Примечания
    638.  
    639.   Атрибуты RECLAIM, CREATE не изменяют содержимое файла, точно также, как и
    640. процедуры LOCK, UNLOCK, HOLD, RELEASE.
    641.   Неясно до конца, для каких целей в заголовке файла используются две длины
    642. файла. При обработке транзакции заголовок файла копируется сразу за последней
    643. страницей файла (т.е. по адресу, указанному в поле (+6)). За заголовком идут
    644. еще какие-то данные (страницы). В этом новом заголовке поле (+6) остается
    645. прежним, а поле (+0Ah) показывает новую длину файла вместе с записанными
    646. данными. Т.е. первая из длин - длина без "неиспользуемого" в конце файла
    647. пространства.