Java-эквивалент библиотеки Python "construct" - PullRequest
3 голосов
/ 06 марта 2011

Есть ли в Java эквивалент библиотеки Python "construct"? Я хочу написать "структуры" так:

message = Struct("message",
    UBInt8("protocol"),
    UBInt16("length"),
    MetaField("data", lambda ctx: ctx["length"])
)

Это не обязательно должна быть библиотека с какой-то абстракцией, использующей язык Java. Я имею в виду, что это может быть «переносимый» формат с API для анализа документов. Я полагаю, что это может сработать с XML, но это будет намного ужаснее.

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

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Я много осмотрелся, и все, что я мог найти, это Ragel (www.complang.org/ragel), который также может создавать Java-код. Это выглядело слишком сложным для меня, поэтому я начал работу по переносу Construct на Java. Я подозреваю, что было бы легче сделать что-то подобное в Scala, Groovy или JavaScript.

Построить на GitHub: https://github.com/MostAwesomeDude/construct

Java-конструкция: https://github.com/ZiglioNZ/construct

Я потратил пару дней на это, в основном на поиски эквивалентов выразительных классов Python. Наиболее полезные классы Java, которые я нашел: java.util.Scanner, java.util.Formatter и java.nio.ByteBuffer. Это большая задача, поэтому я хочу сосредоточиться на чем-то маленьком, например на создании простых синтаксических анализаторов и средств форматирования для ByteBuffers.

[Обновление]

Я перенес достаточно кода для анализа и построения некоторых протоколов, которые поставляются с Python Construct, таких как ethernet, arp и ipv4. Проверьте это в https://github.com/ZiglioNZ/construct

[Обновление: новый выпуск]

Java Construct 1.1.2 теперь доступна, см. примечания к выпуску .

0 голосов
/ 06 марта 2011

Вы можете использовать DataInput / DataOutput (и их реализации) для преобразования любого набора значений из / в набор байтов. Это не дает вам объекта, где вы можете использовать имена для доступа к отдельным полям, - вам придется создать их самостоятельно.

Это немного зависит от того, что вы хотите сделать - у вас есть фиксированный формат данных для отправки / получения по кабелю, или он время от времени меняется?

...