2013-08-01 1 views
1

asn.1 소스 파일 (예 : test.asn1)에서 하나의 구조를 정의하는 동안 문제가 발생했습니다.하나의 asn.1 파일에서 구조 정의의 두 버전을 지원하는 방법

그것은 프로토콜 버전 1에 대해 다음과 같이 정의되어있다 :

PolicyControlDiagnostics ::= ENUMERATED 
{ 
    policy (1), 
    policyControl (2), 
    policyControlResumed (3) 
} 

그런 다음 우리는 프로토콜 버전 2에서 버전 2를 지원하기위한 요구 사항이 일부 필드는 변경되었지만 구조 이름은 변경되지 않고 유지합니다. 예를 들어 변수 정책이 mytestpolicy으로 변경되고 policyControl이 mytestpolicyControl으로 변경되었습니다. 한편 구조 이름 PolicyControlDiagnostics이었다 동일한 버전 1과 버전 2에서

PolicyControlDiagnostics ::= ENUMERATED 
{ 
    mytestpolicy (1), 
    mytestpolicyControl (2), 
    policyControlResumed (3) 
} 

내가 사용 SNAC를 디코딩, BER 인코딩 C 루틴을 생산하려고, 그것은 불평 모두 :

file "test.asn1", line 632: ERROR - type PolicyControlDiagnostics is multiply defined. 

당신은 할 수 이 오류를 해결하는 데 도움을 주시겠습니까? 감사.

답변

1

동일한 ASN.1 모듈에서 동일한 열거 형 이름을 사용하려는 경우 허용되지 않습니다. 동일한 사양의 서로 다른 버전 인 두 개의 별도 ASN.1 모듈이 있고 각 모듈의 이름이 같은 유형이있는 경우 일부 ASN.1 컴파일러는 충돌하는 이름을 자동으로 모호하게합니다.

동일한 ASN.1 모듈에서 동일한 유형 이름을 두 번 사용하는 것은 허용되지 않지만 두 버전의 모듈 (일부 차이점 포함)이 허용됩니다. 이 두 모듈 간의 하위 호환성은 상호 운용성 문제를 피하기 위해 ASN.1 전문가의 지침이 필요합니다.

무료 온라인 컴파일러와 런타임은 http://asn1-playground.oss.com입니다. 유효한 ASN.1 사양을 시험해 볼 수있는 좋은 곳입니다.

+0

폴 감사합니다! 정말 내 질문에 대답했다. 이제 서로 다른 사양을 위해 두 개의 ASN.1 모듈을 정의했습니다. 버전 6의 경우 R6.asn1, 버전 8의 경우 R8.asn1이라고 말하십시오. 그런 다음 BER 인 코드/디코드 용 R6.c 및 R6.h가 컴파일러 snacc를 사용하여 생성되었습니다. R8과 동일합니다. 두 개의 ASN.1 모듈이 시스템과 통합 된 경우 상호 운용성 문제가 있습니다. 시스템이 2 개의 버전 R6과 R8을 지원하기 때문에. 그러나 한 번에 하나의 버전 만 사용되었습니다. 그렇다면 어떤 인코딩/디코드 버전을 사용해야합니까? 이 문제를 어떻게 처리해야할지 모르겠다. 의견이 있으십니까? 감사합니다. – user2641335

+0

프로토콜이 잘 설계된 경우 ASN.1 확장 성을 활용하여 두 가지 사양 중 하나를 사용하여 메시지를 디코딩 할 수 있습니다. 그러나 스펙이 이전 버전과의 호환성을 염두에두고 잘 설계되지 않은 경우, 최선의 제안은 하나의 디코딩으로 해보는 것이고, 실패하면 다른 디코딩으로 해독을 시도하는 것입니다. –

0

오류가이 모든 것을 말합니다. 한 유형에 대해 두 가지 정의를 가질 수는 없습니다. ENUMERATED에 사용 된 이름은 BER 인코딩에 영향을 미치지 않고 변경할 수 있습니다 (XER 인코딩이 영향을받을 수 있음). 따라서 두 정의는 동일하며 하나만 선택할 수 있습니다.