Устройство и формат кэша
Последнее изменение: 02/06/2020 13:36:32Общая информация
Кэш Google Earth это 2 файла: dbCache.dat и dbCache.dat.index. По дефолту, эти файлы распологаются в папке пользователя, но могут быть перенесены в любое место правкой соответствующего параметра в реестре. Файл dbCache.dat - собственно кэш, а dbCache.dat.index - его индекс (сводная информация о наличии тайлов в кэше). Индекс может быть удалён, в этом случае клиент, при запуске, производит переиндексацию кэша и заново создаёт этот файл.
Размер файла кэша ограничен, и его максимальное значение не может превышать 2000 Мб (1.95 Гб). При поступлении данных сверх этого объёма, будет производится перезапись существующих данных в кэше.
Структура dbCache.dat
Файл кэша состоит из 2-х глобальных частей: заголовок и тело. Заголовок файла содержит только служебную информацию и имеет фиксированный размер 34304 байт (0x8600). Всё остальное - тело, содержащее собственно тайлы.
- type
- TCacheFile = record // файл кэша dbCache.dat
- Head : TCache_Head; // заголовок
- Tile : array of PTileRec; // тело - массив блоков: описание + тайл + nil
- end;
Структура заголовка:
- type
- TCache_Head = record // заголовок
- Magic : LongWord; // идентификатор = $D5E1C1CA
- MaxSz : LongWord; // максимальный размер файла кэша
- ACount : LongWord; // число записей авторизации
- SCount : LongWord; // число массива серверов
- Server : array of TServerRec; // массив серверов
- Auth : array of TAuthRec; // массив авторизаций
- end;
- TServerRec = record // запись о сервере
- LastAuth : LongWord; // время последней авторизации на сервере
- Unk : Word; // всегда = $0000
- Name : PChar; // url сервера (иногда в Punycode)
- end;
- TAuthRec = packed record // запись о авторизации
- Magic : LongWord; // идентификатор = $C39AC6B0
- ANumber : LongWord; // номер данной записи авторизации
- Unk : LongWord; // всегда = $00001000
- ATime : LongWord; // время данной авторизации
- end;
Структура записи о тайле в теле dbCache.dat:
- type
- TTileRec = packed record // Описание тайла, размер структуры 36 байт
- Magic : LongWord; // идентификатор = $853662F7
- RecSz : LongWord; // полный размер pазмер блока: описание + тайл + nil
- Ver : Word; // версия тайла
- TileID : Byte; // тип тайла
- RX01 : Byte; // использ. только для истор. снимка: 1-я часть даты
- Zoom : Byte; // зум
- Unk1 : Byte; // ? не использ. или $20 - для истор. снимка
- Layer : Word; // номер слоя или 2-я часть даты для истор. снимка
- NameLo : LongWord; // первая часть имени
- NameHi : LongWord; // вторая часть имени
- Server : Word; // номер сервера из заголовка кэша (первый байт)
- Unk2 : Word; // ? наличие поля зависит от ОС (в Win - есть, в Linux - нет)
- Size : LongWord; // размер тайла
- CRC : LongWord; // контрольная сумма тайла
- end;
Следом за записью о тайле, лежит и сам тайл, а после него - нули, до кратности блока 512 байтам.
Поле Unk2 присутствует только в структуре кэша от Windows-клиента, в кэше Linux-клиента данное поле отсутствует.
Структура dbCache.dat.index
Файл индекса состоит из однотипных записей, каждая из которых описывает наличие одного тайла в кэше. Размер записи 32 байта и она имеет следующую структуру:
- type
- TIndexRec = packed record
- Magic : LongWord; // идентификатор = $D5BF9375
- Ver : Word; // версия тайла
- TileID : Byte; // тип тайла
- Res1 : Byte; // ?
- Zoom : Byte; // уровень зума
- Res2 : Byte; // ?
- Layer : Word; // номер слоя (только для слоя, иначе = 0)
- NameLo : LongWord; // первая часть имени
- NameHi : LongWord; // вторая часть имени
- ServID : Word; // номер сервера из списка в dbCache.dat
- Unk : Word; // ? наличие поля зависит от ОС (в Win - есть, в Linux - нет)
- Offset : LongWord; // позиция тайла в кэше dbCache.dat
- Size : LongWord; // размер тайла
- end;
Поле Unk присутствует только в структуре кэша от Windows-клиента, в кэше Linux-клиента данное поле отсутствует.
Соответственно, файл индекса можно представить как массив записей:
- type
- TIndexFile = array of TIndexRec;
Утилита для распаковки кэша: CacheMaster