我有一个二进制结构,其长度为bit,而value字段对应于该长度。值长度用足够的尾随位填充,以使字段的末尾落在八位字节边界上。我需要计算那个长度,例如:
for length = 24 bits; value length = 3 octets
for length = 17 bits; value length = 3 octets
for length = 31 bits; value length = 4 octets
等
当我在documentation中读到时,可以在.ksy
文件中使用三元运算符。所以我有以下表达式来计算值字段大小:
size: length % 8 == 0 ? length / 8 : length / 8 + 1
这个表达式在Kaitai WebIDE中非常有效,但是当我尝试使用:
生成java类时kaitai-struct-compiler -t java --java-package com.my.struct.package --verbose file mystruct.ksy
我收到以下错误:
parsing mystruct.ksy...
reading mystruct.ksy...
mapping values are not allowed here
in 'reader', line 194, column 44:
... e: length % 8 == 0 ? length / 8 : length / 8 + 1
^
我还尝试在单独的计算值中计算附加八位字节的值,如下所示:
...
- id: prefix
size: length / 8 + additional_octet
instances:
additional_octet:
value: (length % 8 == 0 ? 0 : 1)
...
但同样的错误发生了。
答案 0 :(得分:4)
实际上问题是YAML解析器,因为它打破了:
符号的表达式,解决方法是将表达式放到这样的引号中:
size: 'length % 8 == 0 ? length / 8 : length / 8 + 1'
答案 1 :(得分:3)
简化并且不需要三元组:
size: (length + 7) / 8
没有使用过kaitai结构,我对使用表达式更加怀疑;我希望这里有代码:
"... size: " + ((length + 7) / 8) + " ..."