我的问题是,我想用一个用JAVA实现的通用解析器来解析不同类型的二进制文件。可以使用解析器读取的配置文件来描述文件格式,也可以创建Java类来根据某种解析规则解析文件。
我在互联网上搜索了很多,但几乎找不到关于这个话题的任何东西。
我所发现的只是与编译器生成器(Jay、Cojen等)相关的东西。但是我不认为我可以用它们来生成解析二进制文件的东西。但基于这种假设,我可能是错的。
有没有框架可以特别处理二进制文件的简单解析,或者有人能给我一个提示,我可以使用解析器/编译器生成器来做这件事?
更新:我正在寻找可以写配置文件的东西,比如
file:
header: FIXED("MAGIC")
body: content(10)
content:
value1: BYTE
value2: LONG
value3: STRING(10)
它会自动生成一些东西来解析以“魔术”开头的文件,然后解析十倍于content-package的文件(它本身由一个字节、一个长字符串和一个10字节的字符串组成)。
Update2:我找到了我正在寻找的类似的东西,"Construct",但遗憾的是,这是一个Python框架。也许这能帮助某人找到我想要的东西。
发布于 2009-06-12 09:01:39
试一试preon
发布于 2009-07-10 19:05:07
使用Preon
public class File {
@BoundString(match="MAGIC")
private String header;
@BoundList(size="10", type=Body.class)
private List<Body> body;
private static class Body {
@Bound
byte value1;
@Bound
long value2;
@BoundString(size="10")
String value3;
}
}
解码数据:
Codec<File> codec = Codecs.create(File.class);
File file = codecs.decode(codec, buffer);
如果你遇到问题,请告诉我。
发布于 2009-03-13 21:53:00
我使用DataInputStream读取二进制文件,并用Java语言编写规则。;)二进制文件几乎可以有任何格式,因此没有关于如何读取它们的一般规则。
框架并不总是让事情变得更简单。在您的示例中,描述文件比仅使用DataInputStream读取数据的代码要长。
public static void parse(DataInput in) throws IOException {
// file:
// header: FIXED("MAGIC")
String header = readAsString(in, 5);
assert header.equals("MAGIC");
// body: content(10)
// ?? not sure what this means
// content:
for(int i=0;i<10;i++) {
// value1: BYTE
byte value1 = in.readByte();
// value2: LONG
long value2 = in.readLong();
// value3: STRING(10)
String value3 = readAsString(in, 10);
}
}
public static String readAsString(DataInput in, int len) throws IOException {
byte[] bytes = new byte[len];
in.readFully(bytes);
return new String(bytes);
}
如果你想要一个配置文件,你可以使用Java配置文件。http://www.google.co.uk/search?q=java+configuration+file
https://stackoverflow.com/questions/644737
复制相似问题