gpt4 book ai didi

ssh - Kaitai (KSY) - 可选属性

转载 作者:行者123 更新时间:2023-12-02 14:27:50 25 4
gpt4 key购买 nike

我试图描述 SSH 中的协议(protocol)开泰语言(.ksy 文件)。
一开始有如下格式的协议(protocol)版本交换:

SSH-protoversion-softwareversion SP comments CR LF

在哪里 SP comments是可选的。 AFAIK,无法将属性描述为完全可选,只能通过 if健康)状况。有谁知道如何在 Kaitai 中描述这种关系,以便解析器也接受这种格式: SSH-protoversion-softwareversion CR LF ?

谢谢

最佳答案

Kaitai Struct 并非设计为传统意义上的语法(即映射到 regular languagecontext-free grammarBNF 或类似的东西)。传统语法有“这个元素是可选的”或“这个元素可以重复多次”的概念,但 KS 则相反:它甚至不是试图解决歧义问题,而是建立在一个事实之上,即所有二进制格式被设计为明确的。

因此,每当您遇到诸如“可选元素”或“重复元素”之类的内容而没有任何进一步的上下文时,请暂停一下并考虑 Kaitai Struct 是否是完成任务的正确工具,它真的是二进制格式吗?试图解析。例如,使用 KS 解析 JSON、XML 或 YAML 之类的东西在理论上可能是可行的,但结果并没有多大用处。

也就是说,在这种特殊情况下,完全可以使用 Kaitai Struct,您只需要考虑现实生活中的二进制解析器将如何处理它。据我了解,现实生活中的解析器将读取整行,直到 CR 字节,然后再尝试解释该行的内容。您可以使用以下方法在 KS 中对其进行建模:

seq:
- id: line
terminator: 0xd # CR
type: version_line
# ^^^ this creates a substream with all bytes up to CR byte
- id: reserved_lf
contents: [0xa]
types:
version_line:
seq:
- id: magic
contents: 'SSH-'
- id: proto_version
type: str
terminator: 0x2d # '-'
- id: software_version
type: str
terminator: 0x20 # ' '
eos-error: false
# ^^^ if we don't find that space and will just hit end of stream, that's fine
- id: comments
type: str
size-eos: true
# ^^^ if we still have some data in the stream, that's all comment

如果你想得到 null如果不包含注释,而不是空字符串,只需添加额外的 if: not _io.eof对于 comments属性。

关于ssh - Kaitai (KSY) - 可选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60208954/

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