CKM, или (возможная расшифровка) Creation Kit Mod - "архив" от Беседки, созданный для "бандлинга" модов из Creation Kit в Воркшоп. Применялся ранее до введения системы платных модов, после файлы начали скачиваться "как есть", без каких либо архивов.
Очень примитивный формат. Открыв в HEX-редакторе, и немного включив мозг, можно понять, что к чему.
Первыми четырьмя байтами в архиве всегда записан размер BSA-архива в Little Endian формате (байты идут наоборот). Возможно, есть моды и без BSA в CKM. У меня таких нет, пока что. В таких случаях, скорее всего будет восемь нолей в HEX-представлении.
Открытый в HEX-редакторе CKM, свойства записанного внутри BSA-архива и переведённый размер в HEXПри переводе берём за основу именно фактический размер (100 506 607 байт), а не тот, который в итоге на диске (100 507 648 байт).
Вводим число в калькулятор в режиме программиста, предварительно выбрав DEC, после тыкаем на HEX-режим. Добавляем ноль в начале, если кол-во знаков не кратно двум, получаем размер в HEX: 05 FD 9B EF.
Теперь переворачиваем: EF 9B FD 05. Видим полное совпадение. Значит первыми четырьмя байтами у нас действительно идёт размер BSA-архива. Странно, кстати, что заголовка у файла нет, ну да ладно...
Сразу после размера записан сам BSA, "как есть". Вообще без изменений. Без сжатия и вот этого всего. Видимо, решили не экономить на трафике. Печально, конечно.
Скипнем весь BSA, ведь нам известен размер (записан первыми четырьмя байтами). Идёт четыре нулевых байта (кстати, они идут, даже если BSA архива в файле нет (таки нашёл CKM без BSA)), и сразу начинается сам ESP/ESM. Видно по заголовку (TES4):
Всё, что идёт до красной черты - BSA + 4 нулевых байта (смещающие?). После - ESP.Идёт сам файл плагина до конца файла. Т.е. как только поток закончился - всё, это конец ESP.
На коленке набросал на Шарпе класс, который принимает на вход:
Для себя написал небольшую консольную утилитку, которая умеет распаковывать файлы, если:
По предложению одного из форумчан в комментарии, публикую архив с ней. Писалось для себя, потому если возникнет какая-нибудь ошибка - отрапортует в консоли полностью все технические детали.
Небольшая демонстрация
Очень примитивный формат. Открыв в HEX-редакторе, и немного включив мозг, можно понять, что к чему.
Первыми четырьмя байтами в архиве всегда записан размер BSA-архива в Little Endian формате (байты идут наоборот). Возможно, есть моды и без BSA в CKM. У меня таких нет, пока что. В таких случаях, скорее всего будет восемь нолей в HEX-представлении.
Открытый в HEX-редакторе CKM, свойства записанного внутри BSA-архива и переведённый размер в HEX
Вводим число в калькулятор в режиме программиста, предварительно выбрав DEC, после тыкаем на HEX-режим. Добавляем ноль в начале, если кол-во знаков не кратно двум, получаем размер в HEX: 05 FD 9B EF.
Теперь переворачиваем: EF 9B FD 05. Видим полное совпадение. Значит первыми четырьмя байтами у нас действительно идёт размер BSA-архива. Странно, кстати, что заголовка у файла нет, ну да ладно...
Сразу после размера записан сам BSA, "как есть". Вообще без изменений. Без сжатия и вот этого всего. Видимо, решили не экономить на трафике. Печально, конечно.
Скипнем весь BSA, ведь нам известен размер (записан первыми четырьмя байтами). Идёт четыре нулевых байта (кстати, они идут, даже если BSA архива в файле нет (таки нашёл CKM без BSA)), и сразу начинается сам ESP/ESM. Видно по заголовку (TES4):
Всё, что идёт до красной черты - BSA + 4 нулевых байта (смещающие?). После - ESP.
На коленке набросал на Шарпе класс, который принимает на вход:
- Путь к файлу или поток с CKM.
- Путь к папке, куда надо распаковать.
- Имя мода (используется при формировании имён BSP и ESP-файла).
Для себя написал небольшую консольную утилитку, которая умеет распаковывать файлы, если:
- Дропнуть файл на неё исполняемый (Drag'n'Drop);
- Передать аргументом запуска (можно не в кавычках, если пробелы; я не предусматривал наличие каких-либо иных аргументов);
- Просто запустить, ввести вручную или вставить в окно консоли путь к файлу.
По предложению одного из форумчан в комментарии, публикую архив с ней. Писалось для себя, потому если возникнет какая-нибудь ошибка - отрапортует в консоли полностью все технические детали.
Небольшая демонстрация