2013-08-26 2 views
3

BER (Basic Encoding Rules)을 배우고 이해하려고합니다.BER (Basic Encoding Rules)에 대해 혼동 스럽습니다.

다른 ASN.1 개체를 실험하고 BER을 사용하여 인코딩하려면 웹 사이트 http://asn1-playground.oss.com/을 사용해 왔습니다.

그러나 심지어 심지어 가장 간단한 인코딩도 나를 혼란스럽게합니다.

은의 간단한 ASN.1 스키마를 보자 :
World-Schema DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN 
    Human ::= SEQUENCE { 
    name UTF8String 
    } 
END 

그래서 기본적으로 이것은 단지 name라는 단일 UTF8String에 유형 필드와 SEQUENCE입니다.

같은 것이 순서와 일치하는 값의 예 :

some-guy Human ::= 
{ 
    name "Bob" 
} 

내가 기대 : http://asn1-playground.oss.com/를 사용하여, 그래서

{ "Bob" } 

, 나는 다음과 같은 데이터의 BER 인코딩을 생산 이것은 하나의 시퀀스 객체와 하나의 문자열 객체를 생성한다.

는 내가 얻을 것은 :

30 05 80 03 42 6F 62 

지금, 나는이 인코딩의 일부을 이해합니다. 첫 번째 옥텟 인 30식별자 인이며 SEQUENCE 유형이 첫 번째 개체라는 것을 알려줍니다. 30 우리 1는 (구성 의미)의 0class하는 PC (프리미티브/건설) 비트를 가지고 있음을 의미하고 SEQUENCE

수단 10000의 태그 번호 (십진수 16)되는 이진 00110000 인 여태까지는 그런대로 잘됐다. 다음 값은 길이가 SEQUENCE05의 Y이트입니다.

그래, 지금까지도 그렇게 좋아.

하지만은 ... 나는 다음 옥텟 80에 의해 완전히 혼란입니다. 그게 무슨 뜻입니까 ??? 03 3의 길이를 의미하며, 42 6F 62 단지 UTF8String에 값 자체 "Bob"

입니다 : (. UTF8String에 의미 태그 번호 12) I는 80을 다음

바이트는 매우 간단하다 00001100의 값을 예상했을 것이다

답변

1

80 자동 형 인간이름을 필드에 대한 [0] 태그를 지정하는 자동 태깅 환경을 규정하기 때문에 컨텍스트 특정 클래스가, 원시, 태그 번호 0이 존재 나타낸다.

5

80은 컨텍스트 별 태그 0입니다. "자동 태그"는 모듈 시작 부분에서 사용됩니다.이것은 모든 SEQUENCE, SET 및 CHOICE 유형이 [0]으로 시작하는 구성 요소에 대한 컨텍스트 특정 태그를 가지며 각 후속 구성 요소에 대해 1 씩 증가 함을 나타냅니다. 이런 식으로 메시지를 만들 때 태그 충돌에 대해 걱정할 필요가 없습니다. 특히 OPTIONAL이거나 DEFAULT 값을 가진 구성 요소를 처리 할 때 특히 그렇습니다. "AUTOMATIC"을 "EXPLICIT"으로 변경하면 (권장하지 않음) 인코딩에서 예상했던 [UNIVERSAL 12]가 표시됩니다.

자동 태그는 SEQUENCE, SET 또는 CHOICE 구성 요소의 태그에만 적용됩니다. 최상위 구성 요소에는 적용되지 않으므로 [UNIVERSAL 16]은 상황 별 태그를 보는 대신 SEQUENCE를 보았습니다.

+0

그러나 그렇다면 어떻게 '03 42 6F 62'가 UTF-8 문자열을 나타내는 지 알고 있어야합니까? 데이터가 UTF8string 유형임을 나타내는 식별자 옥텟은 없습니다 – Channel72

+1

원래 ASN.1 사양이 있어야합니다. ASN.1 스펙에서 해당 필드에 사용 된 자동 태그가 UTF8String을 참조 함을 유추 할 수 있습니다. ASN.1 컴파일러를 사용하는 경우 ASN.1 사양의 정보는 인코더/디코더 생성시 유지되므로 해당 필드의 암시 적 태그가 해당 컨텍스트의 UTF8String과 연결됩니다. –

관련 문제