Kaitai Struct 最近出现了旨在解决该任务的倡议:根据规范生成二进制解析器。您可以提供一种基于 YAML/JSON 格式的任意数据结构的序列化方案,如下所示:
meta:
id: my_struct
endian: le
seq:
- id: some_int
type: u4
- id: some_string
type: str
encoding: UTF-8
size: some_int + 4
- id: another_int
type: u4
使用ksc 编译它(它们提供了一个参考编译器实现),瞧,你已经有了任何支持的编程语言的解析器,例如,C++:
my_struct_t::my_struct_t(kaitai::kstream *p_io, kaitai::kstruct *p_parent, my_struct_t *p_root) : kaitai::kstruct(p_io) {
m__parent = p_parent;
m__root = this;
m_some_int = m__io->read_u4le();
m_some_string = m__io->read_str_byte_limit((some_int() + 4), "UTF-8");
m_another_int = m__io->read_u4le();
}
或在 Java 中:
private void _parse() throws IOException {
this.someInt = this._io.readU4le();
this.someString = this._io.readStrByteLimit((someInt() + 4), "UTF-8");
this.anotherInt = this._io.readU4le();
}
将它添加到您的项目后,它提供了一个非常直观的 API(Java 中的一个示例,但它们支持更多语言):
// given file.dat contains 01 00 00 00|41 42 43 44|07 01 00 00
MyStruct s = MyStruct.fromFile("path/to/file.dat");
s.someString() // => "ABCD"
s.anotherInt() // => 263 = 0x107
它支持不同的字节顺序、条件结构、子结构等,等等。可以解析PNG image file format或PE executable等相当复杂的数据结构。