Kos*_*801 17 java file-io parsing binary-data
我的问题是,我想用一个在JAVA中实现的通用解析器来解析不同类型的二进制文件.也许用一个配置文件来描述文件格式,该配置文件由解析器读取或创建根据某种解析规则解析文件的Java类.
我在互联网上搜索了很多,但在这个主题上几乎找不到任何东西.
我发现的只是处理编译器生成器(Jay,Cojen等)的事情,但我认为我不能用它们来生成解析二进制文件的东西.但我在这个假设上可能是错的.
是否有任何框架特别容易解析二进制文件,或者任何人都可以提示我如何使用解析器/编译器生成器这样做?
更新:我正在寻找可以编写配置文件的东西
file:
header: FIXED("MAGIC")
body: content(10)
content:
value1: BYTE
value2: LONG
value3: STRING(10)
Run Code Online (Sandbox Code Playgroud)
它会自动生成一些东西来解析以"MAGIC"开头的文件,然后是内容包的十倍(它本身由一个字节,一个长字节和一个10字节的字符串组成).
Update2:我发现了一些类似我正在寻找的东西," 构造 ",但遗憾的是这是一个Python框架.也许这有助于某人获得一个想法,我正在寻找什么.
Wil*_*ger 12
使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
解码数据:
Codec<File> codec = Codecs.create(File.class);
File file = codecs.decode(codec, buffer);
Run Code Online (Sandbox Code Playgroud)
如果您遇到问题,请告诉我.
Pet*_*rey 10
我使用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);
}
Run Code Online (Sandbox Code Playgroud)
如果要拥有配置文件,可以使用Java配置文件.http://www.google.co.uk/search?q=java+configuration+file
| 归档时间: |
|
| 查看次数: |
10605 次 |
| 最近记录: |