0

我需要读取一个二进制文件,其中字节数组的大小取决于一个可选值以及一个常数。如何使用 Preon 实现这一目标?

似乎字节数组大小计算不能是有条件的,即。大小="adaptationFieldControl==0b10 || 自适应字段控制==0b11 ? 184-adaptationFieldLength : 184"

使用一种方法(参见下面的示例)计算动态大小会使 Preon 失败,原因是:org.codehaus.preon.el.BindingException:无法为名为 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

除非我完全弄错了,否则如果条件为假,@If注释实际上会阻止该字段被注册因此,根据 Preon 的说法,没有称为addaptationFieldLenght. 这样,Preon 现在可以绑定到方法了。从技术上讲,没有什么可以阻止它实现,但我想确保您始终可以生成文件格式的合理 HTML 描述,并且如果隐藏在方法主体中的逻辑,则无法将其转换为文档。

如果你有一些复杂的逻辑根本不适合 Limbo 表达式,你最好Codec为它创建一个。这样,您可以确保您的逻辑也记录在生成的文件格式的描述中。

于 2013-01-22T08:19:14.423 回答
0

Preon 使用语言“Limbo”来实现表达式求值。在 Limbo 中,计算结果为 true 的表达式将取值“1”(假值为“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”注释为前缀的字段,然后实现一个 get 方法,测试这两个字段是否为“null”并返回“non-null”。

于 2013-01-17T10:06:23.490 回答