1

我有一个二进制结构,它有一个以位为单位的长度字段和对应于该长度的值字段。值长度用足够的尾随位填充,以使字段的结尾落在八位字节边界上。我需要计算那个长度,例如: for length = 24 bits; value length = 3 octets for length = 17 bits; value length = 3 octets for length = 31 bits; value length = 4 octets 等。

正如我在文档中阅读的那样,可以在文件中使用三元运算符.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)
...

但是会发生同样的错误。

4

2 回答 2

4

实际上问题是 YAML 解析器,因为它破坏了:符号处的表达式,解决方案是将表达式放入引号中,如下所示:

size: 'length % 8 == 0 ? length / 8 : length / 8 + 1'
于 2017-11-02T09:37:44.630 回答
3

简化并且不需要三元:

size: (length + 7) / 8

没有使用 kaitai struct,我更怀疑使用这样的表达式;我会在这里期望代码:

"... size: " + ((length + 7) / 8) + " ..."
于 2017-11-02T09:35:25.937 回答