我需要读取一个二进制文件,其中字节数组的大小取决于可选的值以及恒定数字。如何使用Preon实现这一目标?
看来字节数组大小计算不能是条件IE。size =" AdaptationFieldControl == 0B10 || AdaptationFieldControl == 0B11?184-AdaptationFieldLength:184"
使用一种方法(请参见下面的示例)来计算动态大小使PREON失败的失败是由以下原因引起的:org.codehaus.preon.el.bindingexception:无法为绑定的数据创建称为getPayloadegenth的绑定。
。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;
...
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"注释前缀的两个字段,然后实现" null"的两个字段,然后返回" non-null"一个字段。
除非我完全错误,否则@If
注释实际上会防止该字段被注册,如果条件为false。因此,根据preon的说法,是没有称为 addaptationFieldLenght
的字段。这,并且Preon现在可以与方法结合。从技术上讲,没有什么可以防止其实现的,但是我想确保您可以生成对文件格式的明智的HTML描述,并且如果隐藏了方法内部的逻辑,则无法将其转换为文档。
如果您有一些复杂的逻辑,这些逻辑根本不适合有困难表达式,那么您可能会为其创建Codec
。这样,您可以确保在生成的文件格式的描述中也记录了逻辑。