- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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)并从中继承 FloatNamedElement
和 UTF8NamedElement
,但我想不出一种方法来现在在当前的 KS 模型中这样做。
关于java - 使用 Kaitai Struct 解析操作码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38513449/
我试图描述 SSH 中的协议(protocol)开泰语言(.ksy 文件)。 一开始有如下格式的协议(protocol)版本交换: SSH-protoversion-softwareversion S
在 Kaitai Struct 中做我的第一步,我一直在尝试将 BSON 解析器作为练习。我解析 BSON 元素的 .ksy 代码现在看起来像这样: element: seq:
我需要从非常大的消息日志中提取和处理数据(可变大小的二进制消息)。使用 Gif 示例和在线文档,我定义了可变大小的消息布局并将其编译到 msg_log.py 中。调用 msg_log.from_fil
我正在尝试让 Kaitai Struct 解析 MP3 的 ID3v1 标签格式。根据standard ,它是一个位于特定偏移量的固定格式结构——但诀窍是这个偏移量不是从文件的开头计算的,而是从末尾计
我正在尝试从这个 stackexchange 答案编译代码:https://reverseengineering.stackexchange.com/a/16631/12521 添加系统导入和类定义后
我正在使用 Kaitai-Struct 解析 Java 中的大型 PCAP 文件。每当文件大小超过 Integer.MAX_VALUE 字节时,我都会遇到由底层 ByteBuffer 的大小限制引起的
我是一名优秀的程序员,十分优秀!