2012-12-29 70 views
0

我需要讀取一個二進制文件,其中一個字節數組的大小取決於一個可選值以及一個常數。我如何使用Preon實現這一目標?如何使用bean的屬性?

看來,字節數組的大小計算不能是有條件的,即。 size =「adaptationFieldControl == 0b10 || adaptationFieldControl == 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; 

...

回答

0

前子使用的語言 「凌波」,落實表達式求值。在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([email protected][]) 

它接縫的邏輯標記只能通過「@If」標註理解。

作爲解決方法,我建議您定義兩個字段,前綴爲「@If」註釋,然後實現get方法來測試兩個字段爲「null」並返回「非null」。

0

除非我完全弄錯了,否則@If註釋實際上會阻止該字段在所有處註冊(如果條件爲false)。所以,根據Preon的說法,沒有字段叫做addaptationFieldLenght。那和Preon現在有辦法綁定到方法。從技術上講,並沒有太多措施來防止它被實現,但我希望確保您可以總是生成一個合理的HTML文件格式描述,並且如果邏輯隱藏在方法體內,則不能將其轉化爲文檔。

如果您有一些複雜的邏輯不適合Limbo表達式,那麼最好爲它創建一個Codec。這樣,您可以確保您的邏輯也記錄在生成的文件格式的說明中。

+0

編解碼器不需要這些位在序列中嗎?在上述情況下,二進制數據包具有標題和大小字段的頭部,其描述了數據包的有效負載(MPEG-TS)中的後續內容。總之,有效載荷不在描述大小的字段旁邊。 – tchristensen

+0

我將不得不看到一個實際的例子,但Preon中使用的表達式語言允許您伸出對象並獲取其他地方的一些數據。這就是很多註釋所做的。它們允許您從完全不同的位置獲取信息,只要數據已被讀取到目前爲止。 –

相關問題