gpt4 book ai didi

parsing - 命名我为二进制解析器。二进制数据解析器

转载 作者:行者123 更新时间:2023-12-03 11:56:36 25 4
gpt4 key购买 nike

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

5年前关闭。




Improve this question




所以,我得到了这些数据。从网络套接字,或者从一个文件中。我正在拼凑可以解释数据的代码。读取一些字节,检查一些标志,一些字节表示后面有多少数据。读入那么多数据,冲洗,重复。

这个任务让我想起了解析源代码。我对 lex/yacc 和 antlr 很满意,但他们无法胜任这项任务。您不能将位和原始字节指定为标记(好吧,也许您可​​以,但我不知道如何),并且您不能将它们哄成“读取两个字节,将它们变成一个无符号的 16 位整数,调用它n,然后读取 n 个字节。”。

再说一次,当协议(protocol)/数据格式的规范以系统的方式定义时(并非全部都是),应该有系统的方式来读取根据协议(protocol)格式化的数据。对?

必须有一个工具可以做到这一点。

最佳答案

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 formatPE executable可以解析。

关于parsing - 命名我为二进制解析器。二进制数据解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2214863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com