2012-12-29 1 views
0

바이트 배열의 크기가 상수뿐만 아니라 선택적 값에 의존하는 이진 파일을 읽어야합니다. Preon을 사용하여 어떻게 이것을 얻을 수 있습니까?preon은 bean 등록 정보를 어떻게 사용할 수 있습니까?

바이트 배열 크기 계산은 조건식 일 수 없다. 크기 = "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에서, 표현식이 참으로 평가되면 "1"(그리고 "0") 값을 취합니다.

결과적으로 식 :

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

아마의 형태를 취할 것입니다 :

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

내가 그것을 테스트, 불행하게도이 방법 크기가 동의하지 않는 솔기. 예외가 발생합니다 :

논리적 토큰은 "@If"주석에 의해서만 이해됩니다.

해결 방법으로 "@If"주석이 접두사로 사용 된 두 개의 필드를 정의한 다음 get 메소드 마녀를 구현하여 "null"에 대한 두 필드를 테스트하고 "null이 아닌"값을 반환하는 것이 좋습니다.

0

내가 완전히 오해하지 않는 한, @If 주석은 실제로 조건이 거짓 일 때 필드가 등록되지 않도록합니다. 따라서 Preon에 따르면 이고 필드는 addaptationFieldLenght입니다. 그것과 Preon은 이제 메소드에 바인딩하는 방법을 가지고 있습니다. 기술적으로 구현되는 것을 막을 수있는 방법은별로 없지만, 파일 형식에 대해 현명한 HTML 설명을 생성 할 수 있는지 확인하고 싶었습니다. 또한 메서드 본문에 논리가 숨겨져 있으면 문서로 변환 할 수 없습니다.

단순한 림보 식에 맞지 않는 복잡한 논리가있는 경우 Codec을 만드는 것이 좋습니다. 그렇게하면 생성 된 파일 형식의 설명에 논리가 문서화되어 있는지 확인할 수 있습니다.

+0

코덱에서 비트가 시퀀스에 있어야합니까? 위의 경우, 바이너리 패킷은 패킷의 페이로드 (MPEG-TS)에서 뒤 따르는 것을 기술하는 플래그 및 크기 필드를 갖는 헤더를 갖는다. 즉, 페이로드는 크기를 설명하는 필드 옆에 없습니다. – tchristensen

+0

실제 예제가 있어야 하겠지만, Preon에서 사용 된 표현식 언어를 사용하면 오브젝트 밖으로 도달하고 다른 곳에있는 일부 데이터를 가져올 수 있습니다. 그것이 많은 주석이하는 일입니다. 그들은 데이터가 지금까지 읽혀져있는 한 완전히 다른 위치에서 정보를 얻을 수 있습니다. –

관련 문제