2013-07-17 2 views
0

Я изучаю синтаксис ASN.1, и я читал много соответствующего материала в Интернете:ASN.1 Последовательность Путаница

http://www.itu.int/rec/T-REC-X.690-200811-I/en
http://luca.ntop.org/Teaching/Appunti/asn1.html
http://www.obj-sys.com/asn1tutorial/node11.html

Я очень запутанные по кодированию типов ASN.1 SEQUENCE. В общем, я понимаю, что SEQUENCE в основном представляет собой совокупность - то, что мы будем называть OBJECT или INSTANCE на большинстве языков программирования. Это в основном список пар имя/значение, аналогичный объекту JSON. Но в отличие от объекта JSON ASN.1 SEQUENCE имеет неявную SCHEMA, потому что это экземпляр «класса».

Таким образом, класс/схема для SEQUENCE может быть что-то вроде:

{ 
    name UTF8String 
    age INTEGER 
} 

И INSTANCE из этой схемы может быть SEQUENCE

{ 
    "John Smith" 
    42 
} 

Но я совершенно запутался о том, как вы можете определить разницу между CLASS и INSTANCE в фактической кодировке BER. На самом деле, я так запутался, я даже не уверен, что ASN.1 SEQUENCE должен быть определением класса или экземпляром класса.

документация, кажется, подразумевает, что это экземпляр:

8,9 Кодирование значения последовательности

8.9.1 Кодирование значения последовательности должны быть построены.

8.9.2 Октеты содержимого должны состоять из полного кодирования одного значения данных от каждого из типов, перечисленных в определении ASN.1 типа последовательности, в порядке их появления в определении , если для типа не было указано ключевое слово OPTIONAL или ключевое слово DEFAULT.

8.9.3 Кодирование значения данных может, но не обязательно, присутствовать для типа, который был ссылочного с ключевым словом ФАКУЛЬТАТИВНЫМ или ключевое слово DEFAULT. Если он присутствует, он должен появиться в кодировке в точке , соответствующей появлению типа в определении ASN.1.

Таким образом, SEQUENCE представляет собой список значений данных, которые должны соответствовать некоторой схеме (классу). Но ASN.1 не имеет типа CLASS, так как вы получаете фактический класс, так что вы знаете, какой класс представляет собой данный SEQUENCE?

ответ

1

Предположим, вы пишете следующее:

R ОПРЕДЕЛЕНИЯ AUTOMATIC TAGS :: =

НАЧАТЬ

USPostalAddress :: = ПОСЛЕДОВАТЕЛЬНОСТЬ {

street  IA5String, 

    city  IA5String, 

    state  IA5String (SIZE (2)) (FROM("A".."Z")), 

    zipcode IA5String (SIZE (5)) (FROM("0".."9")) 

}

END

Часть между BEGIN и END выше называется «присвоением типа». «USPostalAddress» - это имя (определяемого пользователем) «типа». Написав выше, вы указали определенный пользователем тип, и вы дали ему имя. Каждая конструкция SEQUENCE (например, вышеприведенная конструкция SEQUENCE) является «типом». Это сложный тип, поскольку он содержит одно или несколько «полей», каждый из которых имеет свой собственный тип. Возможным «значение» указанного выше типа обозначается следующим образом:

{улица «1234 Main St.», город «Нью-Йорк», состояние «Нью-Йорк», почтовый индекс «12345»}

Мы просто говоря о типах и их значениях, а не о классах и экземплярах. Точно так же, как вы можете иметь тип INTEGER (0..15), значения которого являются целыми числами от 0 до 15, вы можете иметь тип SEQUENCE, значения которого представляют собой устройства значений нижнего уровня. Вышеупомянутый тип последовательности - очень простой пример структур данных («типы»), которые вы можете определить в ASN.1.

(В ASN.1 есть также то, что называется «классом», но это совсем другое дело.)

В ASN.1, сообщения протоколов обычно определяются как типы верхнего уровня (как правило, они SEQUENCE или CHOICE). Особое «значение сообщения» представляет собой значение типа верхнего уровня. Когда у вас есть значение типа верхнего уровня в ваших руках, вы можете закодировать это значение в поток бит, используя один из стандартных правил кодирования (BER, PER и т. Д.). Когда вы получаете поток бит из сети, который, как вам известно, является значением определенного типа ASN.1, закодированного в BER, PER и т. Д., Вы можете декодировать эти биты и получить исходное значение.

0

ASN.1 файл содержит, как правило, тип задания (определения типа), как этот тип последовательности:

myMessage ::= SEQUENCE 
{ 
    a INTEGER(0..100), 
    b INTEGER 
} 

Эти типы ПОСЛЕДОВАТЕЛЬНОСТЬ внутри ASN.1 файл можно рассматривать так же, как классы в ++/Java или структуры определений C в C.

Экземпляры SEQUENCE могут быть в закодированном формате (BER, PER, DER и т. Д.) Или в локальном формате (объекты/переменные) внутри ваших программ.

Пример, как можно реализовать те в C код:

struct myMessage_t   
{ 
    int a; 
    int b; 
}; 

char buffer[1000]; // BER encoded instance will be stored to this buffer 
myMessage_t msg;  // this is the local instance 

msg.a = 1; 
msg.b = 2; 

size_t berLen = berEncode_myMessage(&msg, buffer, sizeof(buffer)); 

и декодирование на стороне для этого:

myMessage_t msg2;    
berDecode_myMessage(buffer, berLen, &msg2); 
assert(msg2.a == 1); 

Вы обычно знаете, что верхний тип уровня кодированного например, прежде чем декодировать Это.

Смежные вопросы