Java v8unpack

Альтернативная-opensource реализация распаковщика cf, epf & etc на Java.

InDev

Основные отличия:

  • распаковывает данные сразу
  • работает в несколько потоков
  • не сохраняет заголовки файлов   уже сохраняет
  • пожирает память нещадно

Документация

По проекту:
Project documentation
Java-doc api: 
API-doc 

Сборка:

git clone https://github.com/MinimaJack/com.minimajack.v8.cf.reader.git
cd com.minimajack.v8.cf.reader
mvn clean compile assembly:single

Забирать из папки ./target/

Для сборки необходимо:

  • maven 3.+
  • JDK 1.8+

Запуск:

для распаковки:

unpack.bat test.epf ./unpacked/

или

java -jar com.minimajack.v8.cf.reader-0.0.1-SNAPSHOT-jar-with-dependencies.jar %file% %path%

для упаковки

pack.bat ./unpacked/ test.epf

java -jar com.minimajack.v8.cf.reader-0.0.1-SNAPSHOT-jar-with-dependencies.jar  %path% %file%

P.S. В первую очередь предназначается для обучения

04.06.2024 Причесал немного код. Выделил библиотеку отдельно, демо пример отдельно.

Исходники:

Библиотеки — https://github.com/MinimaJack/com.minimajack.v8.format

Демо пример, он же распаковщик — https://github.com/MinimaJack/com.minimajack.v8.cf.reader.git

10.06.2024 Обновил файл

26.06.2024 Обновил ссылки на библиотеки

20.04.2024 Демо пример переделан на fork/join pool

26.04.2024 Демо пример переделан, добавлена возможность кеширования файлов по дате модификации которая по умолчанию влючена. Что бы отключить необходимо третьим параметром передать стратегию NONCACHE

28.04.2024 Демо пример переделан с возможностью иерархического построения проекта, без изменения именований.

63 Comments

  1. ekaruk

    Идея интересная.

    Спасибо.

    Давно искала повод покопаться в Java.

    Reply
  2. minimajack

    (1) ekaruk, идея то не новая, фактическая дата создания моего проекта 7 декабря 2014…ну и awa параллельно тоже запилил (https://github.com/awk-kazmin/JV8Unpack).

    Программирование на Java — как глоток свежего воздуха.

    ps Будут вопросы, задавайте — с удовольствием отвечу.

    Reply
  3. DoctorRoza

    Ну что, началось! Java начинает паломничество на святую землю Инфостарт! 🙂

    По ссылке error 404

    Reply
  4. minimajack
  5. nSpirit2

    А обратно запаковывать она умеет?

    Reply
  6. awa

    (2)

    ну и awa параллельно тоже запилил

    Видимо, это просто опечатка. Но на всякий случай уточню, что это не мой проект, а Василия Казьмина http://infostart.ru/profile/44963/

    Reply
  7. minimajack

    (6) awa, да, просто опечатка

    (5) nSpirit2, пока нет

    Reply
  8. baton_pk

    Пора открывать клуб V8Unpacker-ов ?

    Reply
  9. nSpirit2

    (8) baton_pk, Лучше клуб запакеров начинайте основывать 🙂

    (7) Ясно а в планах то есть ?

    Reply
  10. minimajack

    (8) baton_pk, не понял вопроса

    (9) nSpirit2,

    мне не хватило текущего функционала V8Unpack.

    да собирать обратно планирую

    Reply
  11. detec

    Жаль, что интерфейс консольный. Можно было бы реализовать на javafx форму приложения.

    Reply
  12. minimajack

    (11) detec, данная разработка позиционируется как библиотека, а не как самостоятельное приложение. Это позволит использовать код как угодно.

    Reply
  13. ret-Phoenix

    Действительно, подобных проектов несколько штук, но вот еще ни один не дошел до уровня gcomp. Все выгружают просто «RAW», а хотелось бы получить в результате нормальные имена и разбор по каталогам. Тогда от подобных инструментов будет толк (вспоминаю fez, ADirks).

    P.S. не удивлюсь, если есть уже решение, но в public не выложено.

    Reply
  14. minimajack

    (13) ret-Phoenix, (5) nSpirit2, так получается, что текущий функционал можно развивать по разному.

    1. Нормальный разбор: нормальные имена, структура папок

    2. Нормальную сборку — именно низкоуровневую, даем файлы -> получаем упакованный результат.

    3. Полную разборку в папки и сборку — подобно xml выгрузки, загрузки

    Для меня сейчас важнее 2 пункт, но хотелось бы узнать мнение других людей.

    Reply
  15. nSpirit2

    (14) не знаю как другим, но по моему возможность обратно собрать обратно должна обязательно присутствовать в таком проекте иначе его функциональность не будет использоваться в полной мере… Запаковка распаковка так и до альтернативного редактора кода не далеко 🙂 В любом случае такая система решит много проблем с использованием VCS а это большой плюс 🙂

    Reply
  16. baton_pk

    (14)

    2. Нормальную сборку — именно низкоуровневую, даем файлы -> получаем упакованный результат.

    ну, с этим долго возиться вряд ли придётся. тут поле уже пахано-перепахано.

    а вот разбирать всё это дело в понятный формат — вот это действительно требует основательного погружения.

    Reply
  17. minimajack

    (16) baton_pk, без низкоуровневой сборки как то не функционально…ничего сложного нет, но руки не резиновые

    опять же с форматом…что считать нормальным…какой он нормальный . Возможно использовать родной 1с-кий, возможно придумать что то свое…

    Reply
  18. Evil Beaver

    (16) baton_pk, ну так V8Reader же от bambr1975! Там вам и unpack и парсер-распарсер во все поля.

    http://infostart.ru/public/106310 Плюс, их совместный проект с awa — MetaRead, ссылку не помню.

    Reply
  19. baton_pk

    (18) Evil Beaver,

    V8Reader же от Вики Дорохиной

    да, воистину сильнейшая разработка! всё никак повода не находится сесть и разобраться.

    ссылку не помню

    вот для того и нужен «клуб» 🙂 чтоб не бегать по разным местам

    Reply
  20. minimajack

    Разделил код на библиотеку и демо-распаковщик.

    (18) Evil Beaver, жаль MetaRead не нашел, описание метаданных ускорило бы разработку

    Reply
  21. eugeniezheludkov

    Извиняюсь за снобизм, но библиотека не будет полной без документации, а в репо я так её и не нашел. Нужно некое АПИ, его описание, как работать с этой библиотекой, копаться в исходниках? Если будет документация, то это будет продукт отличающийся от других анпакеров. Порог вхождения будет гораздо ниже, что увеличит количество контрибьютеров и пользователей библиотеки

    Reply
  22. minimajack

    (21) eugeniezheludkov, библиотеке от роду три дня, хотя фактически даже сутки не прошли с разделения. Так что документация будет, но пока это даже не альфа.

    пока, как пример, можно смотреть на распаковщик…тем более как ее собираются использовать я не знаю. Будут вопросы задавайте.

    фактически вся логика находится в двух файлах:

    https://github.com/MinimaJack/com.minimajack.v8.cf.reader/blob/master/src/main/java/com/minimajack/v8/parser/Re­ader.java

    https://github.com/MinimaJack/com.minimajack.v8.cf.reader/blob/master/src/main/java/com/minimajack/v8/model/Con­tainerReader.java

    Логика пока такая:

    создаем рутовый контекст -> создаем рутовый контейнер -> указываем в контексте реализацию ридера и просим распарсить данные.

    все остальные файлы, лишь для удобства и скорости работы(работа в несколько потоков и прочее).

    Если будет документация, то это будет продукт отличающийся от других анпакеров

    — основное отличие — это в первую очередь библиотека. С документацией проблемы — возможно на выходных что нибудь подготовлю.

    Reply
  23. minimajack

    Основная страница

    http://minimajack.github.io/v8Unpack4j/index.html

    Java-doc api

    http://minimajack.github.io/v8Unpack4j/apidocs/index.html

    CI — нет сервера.

    Метрики пока не нужны.

    Тестов — пока тоже нет.

    Java-doc — пока без описания, только вызовы и методы

    Reply
  24. ret-Phoenix

    (0) Из приятных мелочей: найденным v8unpack разобрать УП 2 не смог — слетела разборка. Твоей утилитой разобралось.

    Reply
  25. minimajack

    (24) ret-Phoenix, да…к счастью и сожалению она разбирает даже то что не должна

    Reply
  26. ret-Phoenix

    (25) Например? если конфигурация убита и позволяет ее разобрать — это явный плюс )

    Reply
  27. minimajack

    (26) ret-Phoenix, нет…такую конфиграцию не разберет…

    я делаю упаковку из файлов и естественно тестирую ….

    распаковал нормальную обработку -> упаковываю -> снова распаковываю уже упакованую своей обработкой

    так вот у меня все ок — все распаковывается, все на месте до байтика…

    а вот 1С упорно не желает пользоваться — видит зуб да неймет

    Reply
  28. minimajack

    В общем, получилось.

    Распаковал упп -> запаковал обратно -> конфигурация открылась

    теперь о минусах…

    перепакованная версия открывается(сравнение объединение) дольше — необходимо время на изыскания…скорее всего дело в выравнивании, порядке данных и правильной сегментации

    упаковка происходит в один поток, памяти жрет меньше, есть простор для оптимизации

    выводы:

    для внешних обработок подходит

    для полноценных конфигураций пока нет

    упаковывать аналогично распаковке -> только меняется местами параметры

    распаковать: %file% %path%

    упаковать: %path% %file%

    Reply
  29. minimajack

    Народ что дальше?

    1. Нормальный разбор: нормальные имена, структура папок

    2. Скорость упаковки, работы 1С с упакованным файлом?

    голосуем https://github.com/MinimaJack/com.minimajack.v8.cf.reader/issues

    Reply
  30. Rustig

    (29) зачем нужны упаковщики, распаковщики? я просто консультант и ни разу с этим не сталкивался, хотел бы узнать подробности

    Reply
  31. minimajack

    (30) Rustig,

    В первую очередь для системы контроля версий, статического анализа кода и т.п.

    http://infostart.ru/public/335018/

    http://infostart.ru/public/118207/

    Reply
  32. minimajack

    (29)

    Ввиду «оживленного» обсуждения, решил заняться разбором метаданных — «{0,{}}».

    Инструментарий будет в отдельном проекте.

    На текущий момент реализовано чтение: строки, числа, булево, массива, списка, хешмап, UUID, перечислений, объектов(с разбором полей). На выходе получаем заполненный экземпляр класса, со всеми полями. Пока реализовано только чтение; запись будет реализована позже. Запись скорее всего будет в XML формат — ближе к 1С-кому.

    Проекты будут связанны «format.cf» — чтение файлов, «format.???» — описание классов, сериализация-десериализация.

    Скорость — пока на второй план, много времени занимает именно кодинг классов.

    Пример реализации класса — «описания» реквизита:

    Скрытый текст

    з.ы. задача кодерская-нудная, сидеть добавлять перечисления 1С, классы 1С, и сравнивать с сериализацией.

    Reply
  33. baton_pk
    задача кодерская-нудная

    ох, как я тут согласен 🙂 сам пытаюсь на Ц++ классы для управляемых форм сообразить.

    Вообще, тут бы лучше подумать надо хорошей кодогенерацией. Есть тучи XML-ек, которые можно навыгружать из 1С, по ним можно построить XSD (я пробовал trang, который, кстати, на Java), а по XSD уже нагенерить классов.

    Reply
  34. minimajack

    (33) baton_pk,

    В Java все попроще…рефлексия — хлоп-хлоп и готово.

    https://github.com/MinimaJack/com.minimajack.v8.bs.format — мини библиотека для разбора, в стандартной поставке чтение:

    — строк

    — чисел

    — булево

    — UUID

    — классов

    — Enum-ов

    — List-ов

    — Map-ов

    Косяков еще хватает, но потихоньку буду править

    https://github.com/MinimaJack/com.minimajack.v8.example.bs- пример для чтения рутового файла.

    @V8Class
    public class V8Root
    {
    public Integer id;
    
    public UUID guid;
    
    public AnyData hash;
    
    }

    Показать

    Reply
  35. baton_pk

    (34)

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

    Reply
  36. minimajack

    (35) baton_pk,

    «Есть тучи XML-ек, которые можно навыгружать из 1С» — типа выгрузка конфигурации в XML?

    Reply
  37. baton_pk

    (36) она самая.

    Reply
  38. minimajack

    (37) baton_pk, это борода.

    Формат меняется, скорость выгрузки не ахти. Что делать в таком случае с внешними обработками и отчетами?

    Я лучше потихоньку десериализую реальные классы и буду уверен, что все ок.

    Reply
  39. baton_pk

    (38)

    наверное, мы друг друга не понимаем.

    я говорю вот, о чём: есть у меня выгрузка большой-большой конфы (чем больше, тем лучше). там куча файлов, к примеру, Catalog.Справочник1.xml, Catalog.Справочник2.xml, Catalog.Справочник3.xml.

    Сами непосредственно справочники меня мало волнуют, мне нужны их общие поля. Они получаются при генерации схемы. Итого в XSD я вижу, к примеру, список полей, описывающих справочник, как объект метаданных:

    Name
    Synonym
    Comment
    Hierarchical
    HierarchyType
    LimitLevelCount
    LevelCount
    FoldersOnTop
    ……
    

    Показать

    и по ним генерю класс:

    class MetaCatalog {
    
    public string Name;
    public multistring Synonym;
    public string Comment;
    …..
    }
    

    Показать

    Главное в таком подходе — все сложные типы вроде HierarchyType или SearchStringModeOnInputByString можно будет сразу увидеть и сгенерить по ним Enum.

    Сериализации тут нет, её вам всё равно пилить руками надо будет. Тут цель — быстро и относительно малой кровью разово создать всю эту тучу классов, описывающих метаданные, в которые вы потом уже будете сериализировать эти зловещие файлы со скобочками.

    Но это всё пока у меня в теории, потому как до конечного результата я тут пока не дошёл.

    Reply
  40. minimajack

    (39) baton_pk, есть проще вариант:

    http://forum.infostart.ru/forum24/topic21501/message227593/#message227593

    Reply
  41. minimajack

    пример использования совместно java-fx, com.minimajack.v8.bs.format и v8Unpack

    Reply
  42. minimajack

    Объединил библиотеки для чтения под одним корневым проектом…старые репозитории пришлось удалить

    https://github.com/MinimaJack/com.minimajack.v8.format

    Описание:

    http://minimajack.github.io/com.minimajack.v8.format/0.0.9/

    http://minimajack.github.io/com.minimajack.v8.format/0.0.9/com.minimajack.v8.format.cf/

    http://minimajack.github.io/com.minimajack.v8.format/0.0.9/com.minimajack.v8.format.bs/

    Репозиторий:

     <repositories>
    <repository>
    <id>v8Unpack4j</id>
    <url>https:// raw.github.com/MinimaJack/com.minimajack.v8.format/mvn-repo/</url>
    </repository>
    </repositories>
    Reply
  43. minimajack

    (43) v3rter, кому не надо — тот не пользуется.

    Reply
  44. v3rter

    (44) Запакером? Проблема в том, что запакером могут воспользоваться те, кому не надо, и появится новый класс вредоносов.

    Вот распакер — вещь нужная, особенно если портативный и консольный.

    Reply
  45. pumbaE

    (45) v3rter, найдешь на кухне нож — ВЫБРОСИ, а то мало ли чего.

    Reply
  46. capitan

    Rename 0cd0af71-a8c9-45a6-aa56-18ecdd9124b2 to MGNkMGFmNzEtYThjOS00NWE2LWFhNTYtMThlY2RkOTEyNGI

    java.io.IOException: Синтаксическая ошибка в имени файла, имени папки или метке

    и далее штук пять таких же ошибок

    конфигурация состоит из одной формы

    если пробую обработку

    Rename copyinfo to Y29weWluZm8

    java.io.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома

    Что может быть не так ?

    Кроме ДНК 🙂

    Reply
  47. minimajack

    (47) capitan, не может создать файл…возможно не хватает прав

    собрал, проверил

    java -jar com.minimajack.v8.cf.reader-0.0.1-SNAPSHOT-jar-with-dependencies.jar cf.cf ./сf/
    Reply
  48. capitan

    Мерси.

    Так работает.

    С меня +

    В файле unpack.bat на github похоже ошибка

    @echo OFF

    Echo Start parsing

    @java -Xms1G -Xmx2G -jar com.minimajack.v8.cf.reader-0.0.1-SNAPSHOT-jar-with-dependencies.jar %1 ./unpacked/%1

    два раза %1

    Reply
  49. minimajack

    (49) capitan, спасибо, исправил

    Reply
  50. minimajack

    Пофиксил долгое открытие упаковоной конфигурации — надеюсь) в линуксе не тестил — но должно работать.

    «Перешел» на 8 java

    В общем все оказалось проще чем думалось — всего то надо было в алфавитном порядке(в одном регистре) записывать в фс 1С.

    бинарник в шапке обновил…

    Reply
  51. Infactum

    (51)

    А оглавление контейнера у вас одним цельным блоком в начале расположено? Просто для полного соответствия формату, который генерирует сама платформа, оглавление должно состоять из блока в 512 байт в начале контейнера, а все остальные блоки (если они есть) расположены в конце.

    Можете посмотреть мою Python реализацию запаковки, там сразу не было проблемы с быстродействием перепакованных файлов.

    Reply
  52. minimajack

    (52) Infactum, да 512 байт…

    entries = sorted(os.listdir(folder))

    у вас изначально сортируется список файлов — потому и не словили)

    Reply
  53. Infactum

    (53)

    Ну да, и это тоже. Я изначально хотел полного совпадения файлов добиться после перепаковки, поэтому писал все с оглядкой на структуру исходного контейнера, но в итоге параметры сжатия соответствующие подобрать не удалось 🙂

    Reply
  54. minimajack

    (54) Infactum,

    btw у вас сортируется правильно-регистронезависимо? Как долго упаковывается конфигурация?

    ffaac527-f33e-48bc-b09d-43245a025cd5
    FFAAC527-F33E-48BC-B09D-43245A025CD5.0
    ffaac527-f33e-48bc-b09d-43245a025cd5.1
    
    Reply
  55. Infactum

    (55)

    Сортировка правильная.

    Скорость работы это очень субъективный показатель как вы понимаете. Если хотите сравнить со своей реализацией и не устанавливать питон и т.п, то возьмите просто exe’шник из вот этой темы и проверьте на вашем компьютере и вашей тестовой конфигурации.

    Reply
  56. minimajack

    (56) Infactum, спасибо. Жаль у вас время работы не выводится

    Reply
  57. Infactum

    (57)

    Просто тот исполняемый файл — это лишь демонстрация возможностей моего модуля, поэтому никаких «плюшек» там нет. Распаковывает/запаковывает по ключам командной строки и все.

    А субъективно что скажете? Разница есть?

    Reply
  58. minimajack

    (58) Infactum, ваш не ест память, мой быстрее работает ) как то такие ощущения

    а не…в принципе время сопоставимое

    Reply
  59. eugeniezheludkov
    Reply
  60. minimajack

    (60) eugeniezheludkov, да нет прав на фс

    проверьте еще раз параметры запуска программы или напишите сюда

    Reply
  61. serge_focus

    Для файлов epf & etc — может быть и альтернатива да и то до выхода 8.3.8..

    А с 8.3.7.1759 конфигуратор нормально сохраняет в файлы для GITa

    Reply
  62. farkhod

    Отвалилось с ошибкой

    Exception in thread «main» java.lang.NullPointerException

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:19)

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:21)

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:8)

    at com.minimajack.v8.code.impl.CodeProcessor.process(CodeProcessor.java:15)

    at com.minimajack.v8.project.Project.unpackProject(Project.java:79)

    at com.minimajack.v8.MainApp.main(MainApp.java:45)

    Reply
  63. minimajack

    (63)

    read «main» java.lang.NullPointerException

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:19)

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:21)

    at com.minimajack.v8.code.impl.RelativizeProcessor.process(RelativizeProcessor.java:8)

    at com.minimajack.v8.code.impl.CodeProcessor.process(CodeProcessor.java:15)

    at com.minimajack.v8.project.Project.unpackProject(Project.java:79)

    at com.minimajack.v8.MainApp.main(Main

    очень похоже на некорректные параметры или отсутствие доступа к файловой системе…

    https://github.com/MinimaJack/com.minimajack.v8.cf.reader/blob/develop/dist/unpack.bat

    первый параметр конфигурация, второй параметр — путь к папке в которую надо разобрать проект

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *