2017-11-02 11 views
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 など3進演算子を使用して長さを計算する

私はdocumentationで読んで、.ksyファイル内の三項演算子を使用することが可能です。だから私は、値フィールドのサイズを計算するには、次の式を持っている:

size: length % 8 == 0 ? length/8 : length/8 + 1 

この式は解体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

それあなたは 'size:length/8 +(length%8 == 0?0:1)'で試すことができますが、これは単なる推測です。あなたが提供するドキュメントは、式( 'length/8')ではなく値であることに注意してください。 – AxelH

答えて

3

簡素化し、三元は必要ありません。

size: (length + 7)/8 

使用解体構造体は、私はより多くのような表現を使用しての私の疑問を持っていたわけではありません。ここで私が期待しているだろうコード:それは:記号で表現を壊すよう

"... size: " + ((length + 7)/8) + " ..." 
4

は、実際に問題がYAMLパーサで、解決策は次のように引用符の中に式を置くことです:

size: 'length % 8 == 0 ? length/8 : length/8 + 1' 
関連する問題