0

バイト配列のサイズがオプションの値と定数に依存するバイナリ ファイルを読み取る必要があります。Preonを使用してこれを達成するにはどうすればよいですか?

バイト配列サイズの計算は条件付きではできないようです。size="adaptationFieldControl==0b10 || adaptFieldControl==0b11 ? 184-adaptationFieldLength : 184"

メソッド (以下のサンプルを参照) を使用して動的サイズを計算すると、Preon は「Caused by: org.codehaus.preon.el.BindingException: Failed to create binding for bound data called getPayloadLength.

public class packet {
    @BoundNumber(size = "2")
    byte adaptationFieldControl;

    /**
     * Returns the size of the payload if present in the packet
     * @return size corrected for adaptation fields
     */
    public int getPayloadLength() {
        if(isAdaptationFieldsPresent()) {
            return 188 - (4+adaptationFieldLength);
        }
        return 188-4;
    }

    @If("adaptationFieldControl==0b10 || adaptationFieldControl==0b11")
    @BoundNumber(size="8")
    short adaptationFieldLength;

    @If("adaptationFieldControl==0b01 || adaptationFieldControl==0b11")
    @BoundList(size="payloadLength")
    byte[] payload;

...

4

2 に答える 2

0

私が完全に間違っていない限り、条件が false の場合、@If注釈は実際にはフィールドがまったく登録されないようにします。したがって、プレオンによれば、というフィールドはありaddaptationFieldLenghtません。これで、Preon はメソッドにバインドする方法を手に入れました。技術的には実装を妨げるものはあまりありませんが、ファイル形式の賢明な HTML 記述を常に生成できるようにしたかったのです。また、メソッドの本体内にロジックが隠されている場合、それをドキュメントに変換することはできません。

単純に Limbo 式に適合しない複雑なロジックがある場合は、そのCodecための を作成する方がよい場合があります。そうすれば、生成されたファイル形式の説明にもロジックが文書化されていることを確認できます。

于 2013-01-22T08:19:14.423 に答える
0

Preon は言語「Limbo」を使用して式の評価を実装します。Limbo では、true と評価された式は "1" (および false "0") の値を取ります。

結果として、式:

size=adaptationFieldControl==0b10 || adaptationFieldControl==0b11
    ? 184-adaptationFieldLength : 184

おそらく次の形式になります。

size=184-(adaptationFieldControl==0b10||adaptationFieldControl==0b11)
    *adaptationFieldLength

私はそれをテストしましたが、残念ながら、メソッドのサイズがそれを受け入れていないようです。私は例外を受け取ります:

org.codehaus.preon.el.InvalidExpressionException: NoViableAltException(18@[])

論理トークンは「@If」アノテーションによってのみ理解されるようです。

回避策として、「@If」アノテーションを前に付けた 2 つのフィールドを定義し、get メソッドを実装して、2 つのフィールドの「null」をテストし、「null 以外」のフィールドを返すことをお勧めします。

于 2013-01-17T10:06:23.490 に答える