Некоторое время назад понадобилось массово определять, в какой версии КОМПАС был создан файл без установки самой программы. Задача возникла при обработке большой базы чертежей и моделей (.cdw, .spw, .frw, .m3d, .a3d), так как для каталога неплохо было бы понимать минимальную версию программы, в которой файл ещё открывается.
В процессе выяснилось, что у КОМПАС-файлов два принципиально разных контейнера, один из них бинарный и для него нет никакого официального описания формата.
С версии 16 файл - обычный ZIP. Внутри лежит текстовый FileInfo (UTF-16, ini-подобный): там есть поля вроде AppVersion / AppFullVersion (KOMPAS-3D V17, 16.1.0.0 и т. п.). Версию можно прочитать напрямую, хотя сам формат надписи может различаться.
До 16-й (и иногда позже, если файл остался в старом контейнере) формат бинарный. Сигнатура - KF, сразу за ней - 4 байта big-endian: код формата, например 0x4E00000C. Официальной таблицы «код -> версия» ASCON не публикует, по крайней мере я не нашел. Выглядит это как-то так:
4B 46 | 4E 00 00 0C → KF + 0x4E00000C → v12 SP1.
Часть соответствий уже была в базе утилиты file (libmagic): сигнатура KF + значение по смещению 2. Этого хватало примерно до линейки 5.x–12.x, но не на весь набор кодов, который встречается в реальных файлах (альтернативные коды одной мажорной версии, 13–15, редкие 5.x и т. д.).
Проверка на реальных данных
Дальше провели эмпирическое исследование на большой выборке файлов - прогнали каталог через пайплайн извлечения метаданных: для каждого файла определили вариант (ZIP-контейнер / бинарный KF) и вытащили либо поля из FileInfo, либо hex-код из заголовка KF. Собрали неизвестные коды и постепенно достраивали карту. Сопоставили коды с косвенными признаками:
датами появления файлов в базе и хронологией релизов КОМПАС
с картой из libmagic
с читаемым FileInfo у соседних файлов той же эпохи
Для подавляющего большинства кодов нашлась правдоподобная соответствующая версия.
Когда я говорю “мы”, конечно же я имею в виду себя и нейросеть.
Работоспособность подхода была протестирована на:
341 667 КОМПАС файлов из базы https://c-stud.ru
124 799 КОМПАС файлов из базы https://alldrawings.ru
Успешных определений формата около 95%. Таким образом появилась возможность достаточно надежно определять версию КОМПАСа прямо во время загрузки материала.
Утилита

Также решил накидать отдельную простенькую утилиту для определения версии - возможно кому-то пригодится. Есть консольная версия для Linux и GUI версия для Windows (поддерживается Windows 10 и новее). Скачать можно здесь, там же будут выходить и новые версии. Возможно в будущем будет добавлена поддержка других CAD файлов, если это будет кому-то нужно. С помощью утилиты можно определить версию отдельного файла или всех файлов в указанной папке. В текущую версию утилиты включён 51 уникальный код бинарного KF-контейнера.
Вот такой опыт реверс-инжиниринга. Естественно, правильность определения версии никак не гарантируется.

