Некоторое время назад понадобилось массово определять, в какой версии КОМПАС был создан файл без установки самой программы. Задача возникла при обработке большой базы чертежей и моделей (.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 у соседних файлов той же эпохи

Для подавляющего большинства кодов нашлась правдоподобная соответствующая версия.

Когда я говорю “мы”, конечно же я имею в виду себя и нейросеть.

Работоспособность подхода была протестирована на:

Успешных определений формата около 95%. Таким образом появилась возможность достаточно надежно определять версию КОМПАСа прямо во время загрузки материала.

Утилита

Windows интерфейс утилиты
Windows интерфейс утилиты

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

Вот такой опыт реверс-инжиниринга. Естественно, правильность определения версии никак не гарантируется.

Комментарии (10)


  1. eps
    10.08.2026 08:54

    Не думали отправить изменения в upstream file / libmagic ?


  1. Radon17
    10.08.2026 08:54

    А описание где-то будет опубликовано? Создать бы конвертор из всего во всё...


  1. konst90
    10.08.2026 08:54

    Вообще конечно очень удручает, что Компас (да и многие другие разработчики подобных пакетов) так и не научились делать обратно-совместимые файлы, не сумели написать отдельный конвертер в более старую версию, и даже требуемую версию пакета при попытке открыть не определяют.

    @kompas_3d почему у вас всё так?

    Понятно, что в новых версиях появляется новый функционал, который старой версией не поддерживается, но не открываются даже примитивные файлы с построениями, которые уже лет десять как существуют.


    1. kompas_3d
      10.08.2026 08:54

      Обратная совместимость у нас как раз есть - все старые файлы читаются в новых версиях.

      Файлы бинарные - смена версии программы и ядра, добавление новой функциональности меняет очень многое в структуре файла и предсказать эти изменения невозможно. Там даже версия компилятора повлиять может.


      1. osmanpasha
        10.08.2026 08:54

        меняет очень многое в структуре файла и предсказать эти изменения невозможно. Там даже версия компилятора повлиять может

        Ну вот это и означает "так и не научились делать обратно-совместимые файлы". Видимо, вы просто пишете внутренние структуры из памяти в файл, а надо было сделать сериализатор/десериализатор, который пишет в файл независимо от компилятора и упаковки структур в оперативной памяти.


        1. kompas_3d
          10.08.2026 08:54

          Обратная совместимость - возможность чтения старых файлов в новых версиях. У нас она есть.


          1. LostFire
            10.08.2026 08:54

            Я думаю, человек пишет о том, что новые версии программы не могут десериализовывать старые бинарные форматы также как и новые zip-форматы. Если может, то тогда вопросов к вам нет.


            1. kompas_3d
              10.08.2026 08:54

              Старые файлы прекрасно открываются в новых версиях, с этим никогда не было никаких проблем. Более того открытие старых файлов регулярно тестируют.

              Чтобы файл из новой версии открылся в старых версиях, нужно нажать сохранить как и выбрать формат прошлой версии - т.е. это тоже возможно, просто надо сделать дополнительные действия.


  1. riky
    10.08.2026 08:54

    Помню надо было превью извлечь для внутренней црм. Там в зип файле оно есть как tiff к которому добавлен доп кастомный заголовок не помню, типа 18 или 36 байт. Их заголовок можно отбросить и получить нормальный tiff.


    1. fafnir999 Автор
      10.08.2026 08:54

      Вы правы, превью тоже можно достать из файла - на сайтах этот этап делается, в статье это не упомянул. Результат можно посмотреть например здесь - https://alldrawings.ru/spisok-kategorij/item/kryshka-i-shtamp-dlia-eio-izgotovleniia