Java中与Python "construct"库相当的实现

2 投票
2 回答
905 浏览
提问于 2025-04-16 13:06

有没有类似于Python中“construct”库的Java库?我想像这样写“结构体”:

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

这个库不一定要是用Java语言做的某种抽象库。我是说,它可以是一个“可移植”的格式,带有解析文档的API。我想这样做可能用XML可以实现,但看起来会丑得多。

我知道我可以和Python一起使用,但我不想那样做。

2 个回答

0

你可以使用 DataInputDataOutput(以及它们的具体实现)来把一组值转换成一组字节,或者把字节转换回值。不过,这样做并不会给你一个可以用名字来访问每个字段的对象,你需要自己去创建这样的对象。

这有点儿取决于你想要做什么——你是有一个固定的数据格式来发送或接收数据,还是这个格式会不时变化呢?

2

我查了很多资料,发现的唯一一个可以生成Java代码的工具是Ragel(网址:www.complang.org/ragel)。不过对我来说,这个看起来太复杂了,所以我开始尝试把Construct移植到Java上。我觉得用Scala、Groovy或者JavaScript来做可能会更简单一些。

Construct的GitHub链接:https://github.com/MostAwesomeDude/construct

Java版Construct的链接:https://github.com/ZiglioNZ/construct

我花了几天时间,主要是在找一些和Python的表达性类相似的Java类。我发现最有用的Java类有:java.util.Scanner、java.util.Formatter和java.nio.ByteBuffer。这是个大工程,所以我想先专注于做一些简单的解析器和格式化器,用于ByteBuffer。

[更新]

我已经移植了足够的代码,可以解析和构建一些Python Construct自带的协议,比如以太网、ARP和IPv4。可以在这里查看:https://github.com/ZiglioNZ/construct

[更新:新版本]

Java Construct 1.1.2现在可以使用了,查看发布说明

撰写回答