我想拥有一个Kaitai Struct ksy文件,该文件引用了不同外部文件中的一些枚举和类型。在外部文件中,我只希望具有子类型和枚举定义。
这是引用外部类型的测试文件( test.ksy )
meta:
id: test
imports:
- rowing
endian: be
seq:
- id: system_id
type: u1
- id: data
type:
switch-on: system_id
cases:
rowing_messages::position: rowing::rowing_position_message
,这是文件( rowing.ksy ),包括外部类型:
meta:
id: rowing
endian: be
enums:
rowing_messages:
0x10: position
0x12: meter_per_stroke
types:
rowing_position_message:
seq:
- id: id
type: u1
- id: timestamp
type: u4
编译器抱怨:
test: /seq/1/type/cases/EnumByLabel(identifier(rowing_messages),identifier(position)): unable to find enum 'rowing_messages', searching from test
根据我的测试,看来我可以引用带有前缀rowing::
的外部rowing_position_message类型,但对于枚举却不能这样做。如果我像rowing::rowing_messages::position
那样做,编译器会抱怨:
/seq/1/cases/rowing::rowing_messages::position: parsing expression 'rowing::rowing_messages::position' failed on 1:24, expected "or" | CharsWhile(Set( , n)) | "\\\n" | End
提前感谢任何想法。
答案 0 :(得分:1)
在这里rowing::
是正确的行为,因为除此之外,编译器无法引用在外部类中声明的枚举。
此外,您需要通过添加
将system_id
声明为枚举,而不仅仅是整数
enum: 'rowing::rowing_messages'
此问题已在相对较新的编译器中得到解决(即> 0.8,任何现代的0.9不稳定快照都应工作),因此应能工作:
- id: system_id
type: u1
enum: 'rowing::rowing_messages'
- id: data
type:
switch-on: system_id
cases:
'rowing::rowing_messages::position': 'rowing::rowing_position_message'
对于在枚举上使用.to_i
的另一种可能的选择(理论上,您不希望在实践中使用它),请在https://github.com/kaitai-io/kaitai_struct/issues/643上查看更详细的说明。