Специфікація формату файлу SxGeo v2.1

Файл бази даних Sypex Geo версії 2.1 (скорочено SxGeo v2.1) складається з:

  1. Заголовок
  2. Індекс перших октетів (байт)
  3. Основний індекс
  4. Діапазони IP
  5. Довідник регіонів (опціонально)
  6. Довідник міст (опціонально)

Розглянемо їх докладніше.

1. Заголовок

Заголовок містить 32 байти інформації про вміст БД. Структура заголовка, а також значення для прикладу, представлені в наступній таблиці.

Зміщення Розмір Значення Опис
1 0 3 SxG Ідентифікатор файлу "SxG"
2 3 1 21 Версія файлу (21 => 2.1)
3 4 4 0 Час створення (Unix timestamp)
4 8 1 2 Парсер (0 - Universal, 1 - SxGeo Country, 2 - SxGeo City, 11 - GeoIP Country, 12- GeoIP City, 21 - ipgeobase)
5 9 1 0 Кодування (0 - UTF-8, 1 - latin1, 2 - cp1251)
6 10 1 224 Елементів в індексі перших байт (до 255)
7 11 2 2840 Елементів в основному індексі (до 65 тис.)
8 13 2 1034 Блоків в одному елементі індексу (до 65 тис.)
9 15 4 1 877 608 Кількість діапазонів (до 4 млрд.)
10 19 1 Розмір ID-блоку в байтах (1 для країн, 3 для міст)
11 20 2 46  Максимальний розмір запису регіону (до 64 КБ)
12 22 2 51 Максимальний розмір запису міста (до 64 КБ)
13 24 4 30936 Розмір довідника регіонів
14 28 4 2 820 691 Розмір довідника міст

Примітка: для зберігання чисел використовується порядок байт - від старшого до молодшого (big-endian). Усі числа є беззнаковими цілими.

2. Індекс перших байт (октетів)

Індекс перших байт складається з 4-байтних чисел, що містять зміщення в базі для кожного першого байта. 4 байти замість 3-х вибрано з значно більшої швидкості перетворення 4-байтних чисел і незначному збільшенні займаного місця. Містить 224 значення від 0 до 223, так як адреси з 224 і вище зарезервовані (але передбачена можливість збільшення цього значення до 255).

3. Основний індекс

Основний індекс ділить базу даних на рівні фрагменти. Кількість таких фрагментів може змінюватись і дорівнює значенню "Елементів в основному індексі" в Заголовку. Кожен елемент індексу складається з 4-байт, що є першим IP кожного фрагмента бази даних. Кількість діапазонів у кожному повному фрагменті "Блоків в одному елементі індексу", останній фрагмент може бути не повним і містити меншу кількість діапазонів.

Розмір основного індексу підбирається з розрахунку, щоб розмір Заголовок + Індекс перших байт + Основний індекс nbsp; був кратний 4096, і щоб кількість блоків в одному елементі індексу було не більше 2000. За замовчуванням, для баз даних з містами в основному індексі -2840 елементів. Вказані значення рекомендовані, але не є обов'язковими.

4. Діапазони

Діапазони зберігаються у вигляді 3 байт (IP початку діапазону без першого байта) + від 1 до 4 байт зберігають ID об'єкта або зміщення запису в довіднику. Кінцеві діапазони не зберігаються. Під час створення бази даних при виявленні "дірок" між двома діапазонами - між ними автоматично вставляється порожній діапазон зі значенням ID рівним 0. Таким чином база даних покриває абсолютно всі IP, і кінцем поточного діапазону завжди є початок наступного діапазону.

Розмір ID вказується в Заголовку (Розмір ID-блоку), а повертати цей ID або потрібно дивитися довідник залежить від типу бази даних, зазначеного в Заголовку.

5. Довідник регіонів

Регіони зберігаються у вигляді рядків з нульовим символом наприкінці. За отриманим зміщенням зчитується рядок максимального для запису  регіону довжини (зазначено в Заголовку), після чого рядок розбивається за нульовим символом і видається необхідна кількість елементів. 

Довідник регіонів є опціональним.

6. Довідник міст

Міста зберігаються у вигляді чисел у бінарному вигляді, після яких йдуть рядки з нульовим символом наприкінці. За отриманим зміщенням зчитується рядок максимальної для міста довжини, після чого з початку рядка перетворюється на задану кількість чисел, а залишок рядка розбивається за нульовим символом.

Довідник міст є опціональним.