Устройство и формат кэша

Последнее изменение: 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). Всё остальное - тело, содержащее собственно тайлы.

Delphi code
  1. type
  2.   TCacheFile = record                // файл кэша dbCache.dat
  3.     Head : TCache_Head;              // заголовок
  4.     Tile : array of PTileRec;        // тело - массив блоков: описание + тайл + nil
  5.   end;

Структура заголовка:

Delphi code
  1. type    
  2.   TCache_Head = record               // заголовок
  3.     Magic    : LongWord;             // идентификатор = $D5E1C1CA
  4.     MaxSz    : LongWord;             // максимальный размер файла кэша
  5.     ACount   : LongWord;             // число записей авторизации
  6.     SCount   : LongWord;             // число массива серверов
  7.     Server   : array of TServerRec;  // массив серверов
  8.     Auth     : array of TAuthRec;    // массив авторизаций
  9.   end;
  10.  
  11.   TServerRec = record                // запись о сервере
  12.     LastAuth : LongWord;             // время последней авторизации на сервере
  13.     Unk      : Word;                 // всегда = $0000
  14.     Name     : PChar;                // url сервера (иногда в Punycode)
  15.   end;
  16.  
  17.   TAuthRec = packed record           // запись о авторизации
  18.     Magic    : LongWord;             // идентификатор = $C39AC6B0
  19.     ANumber  : LongWord;             // номер данной записи авторизации
  20.     Unk      : LongWord;             // всегда = $00001000
  21.     ATime    : LongWord;             // время данной авторизации
  22.   end;

Структура записи о тайле в теле dbCache.dat:

Delphi code
  1. type
  2.   TTileRec = packed record // Описание тайла, размер структуры 36 байт  
  3.     Magic   : LongWord;    // идентификатор = $853662F7                
  4.     RecSz   : LongWord;    // полный размер pазмер блока: описание + тайл + nil
  5.     Ver     : Word;        // версия тайла                          
  6.     TileID  : Byte;        // тип тайла                            
  7.     RX01    : Byte;        // использ. только для истор. снимка: 1-я часть даты
  8.     Zoom    : Byte;        // зум                                  
  9.     Unk1    : Byte;        // ? не использ. или $20 - для истор. снимка
  10.     Layer   : Word;        // номер слоя или 2-я часть даты для истор. снимка      
  11.     NameLo  : LongWord;    // первая часть имени                    
  12.     NameHi  : LongWord;    // вторая часть имени                    
  13.     Server  : Word;        // номер сервера из заголовка кэша (первый байт)
  14.     Unk2    : Word;        // ? наличие поля зависит от ОС (в Win - есть, в Linux - нет)
  15.     Size    : LongWord;    // размер тайла
  16.     CRC     : LongWord;    // контрольная сумма тайла
  17.   end;

Следом за записью о тайле, лежит и сам тайл, а после него - нули, до кратности блока 512 байтам.

Поле Unk2 присутствует только в структуре кэша от Windows-клиента, в кэше Linux-клиента данное поле отсутствует.

Структура dbCache.dat.index

Файл индекса состоит из однотипных записей, каждая из которых описывает наличие одного тайла в кэше. Размер записи 32 байта и она имеет следующую структуру:

Delphi code
  1. type
  2.   TIndexRec = packed record
  3.     Magic  : LongWord;  // идентификатор =  $D5BF9375
  4.     Ver    : Word;      // версия тайла
  5.     TileID : Byte;      // тип тайла
  6.     Res1   : Byte;      // ?
  7.     Zoom   : Byte;      // уровень зума
  8.     Res2   : Byte;      // ?
  9.     Layer  : Word;      // номер слоя (только для слоя, иначе = 0)
  10.     NameLo : LongWord;  // первая часть имени
  11.     NameHi : LongWord;  // вторая часть имени
  12.     ServID : Word;      // номер сервера из списка в dbCache.dat
  13.     Unk    : Word;      // ? наличие поля зависит от ОС (в Win - есть, в Linux - нет)
  14.     Offset : LongWord;  // позиция тайла в кэше dbCache.dat
  15.     Size   : LongWord;  // размер тайла
  16.   end;

Поле Unk присутствует только в структуре кэша от Windows-клиента, в кэше Linux-клиента данное поле отсутствует.

Соответственно, файл индекса можно представить как массив записей:

Delphi code
  1. type
  2.   TIndexFile = array of TIndexRec;

Утилита для распаковки кэша: CacheMaster