gpt4 book ai didi

java - 使用 Kaitai Struct 解析操作码

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:14:21 26 4
gpt4 key购买 nike

在 Kaitai Struct 中做我的第一步,我一直在尝试将 BSON 解析器作为练习。我解析 BSON 元素的 .ksy 代码现在看起来像这样:

  element:
seq:
- id: el_type
type: u1
enum: bson_type
- id: el_name
type: strz
encoding: UTF-8
if: el_type != bson_type::end_of_document
- id: el_string
type: bson_string
if: el_type == bson_type::string
- id: el_document
type: bson_document
if: el_type == bson_type::document
- id: el_boolean
type: u1
if: el_type == bson_type::boolean
- id: el_int32
type: s4
if: el_type == bson_type::int32
- id: el_int64
type: s4
if: el_type == bson_type::int64
enums:
bson_type:
0: end_of_document
1: double
2: string
3: document
8: boolean
0x10: int32
0x12: int64

您可能已经注意到,其中有很多重复项。每次想要执行其他元素类型时,只需使用 go duplicate if block 。更糟糕的是,您基本上必须在每个此类字段中重复 3 次内容,即:

  - id: el_string                    # <= string!
type: bson_string # <= string!
if: el_type == bson_type::string # <= string!

我的目标语言是 Java。在开泰之前,我只试过Preon,那里有这样的子句:

@Choices(prefixSize = 8, alternatives = {
@Choice(condition = "prefix==0x01", type = FloatNamedElement.class),
@Choice(condition = "prefix==0x02", type = UTF8NamedElement.class)
}
private NamedElement elements;

你会根据“prefix”的值自动获得这两个元素。开泰可以做吗?

最佳答案

好吧,你是对的,这个功能已经被请求了 3 到 4 次 ;) 我已经 filed an issue为此。

我不同意 Preon 的实现,不过,它对我来说似乎非常有限。您只能有一个“前缀”,它始终是整数,并且必须始终紧跟在您的选择点之前。

我想实现一些更通用的 switch 样式语句,类似这样:

  - id: value
switch: code
cases:
string:
type: bson_string
document:
type: bson_document
boolean:
type: u1
int32:
type: s4
int64:
type: s8

你怎么看?

请注意,您可能不会像使用 Preon 那样获得“正确的”OOP 对象层次结构。这是因为 Preon 的类是手工制作的,您实际上可以做公共(public)父类(super class)并从中继承 FloatNamedElementUTF8NamedElement,但我想不出一种方法来现在在当前的 KS 模型中这样做。

关于java - 使用 Kaitai Struct 解析操作码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38513449/

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