Có vẻ như bạn cần giới thiệu về gắn thẻ ASN.1. Có hai góc để tiếp cận điều này từ. X.690 định nghĩa các quy tắc mã hóa BER/CER/DER. Như vậy, nó trả lời câu hỏi về cách các thẻ được mã hóa. X.680 định nghĩa bản thân ASN.1. Như vậy, nó xác định cú pháp và quy tắc cho gắn thẻ. Cả hai thông số kỹ thuật có thể được tìm thấy trên trang web của ITU-T. Tôi sẽ cung cấp cho bạn một cái nhìn tổng quan nhanh chóng.
Thẻ được sử dụng trong BER/DER/CER để xác định loại. Chúng đặc biệt hữu ích cho việc phân biệt các thành phần của một SEQUENCE và các lựa chọn thay thế cho SỰ LỰA CHỌN.
Thẻ kết hợp một lớp thẻ và số thẻ. Các lớp thẻ là UNIVERSAL, APPLICATION, PRIVATE và CONTEXT-SPECIFIC. Lớp UNIVERSAL về cơ bản được sử dụng cho các kiểu tích hợp sẵn. APPLICATION thường được sử dụng cho các loại do người dùng định nghĩa. CONTEXT-SPECIFIC thường được sử dụng cho các thành phần bên trong các loại được xây dựng (SEQUENCE, CHOICE, SEQUENCE OF). Cú pháp, khi các thẻ được chỉ định trong một mô-đun ASN.1, chúng được viết bên trong các dấu ngoặc vuông: [tag_class tag_number]; cho CONTEXT-SPECIFIC, thẻ_class bị bỏ qua. Do đó, [APPLICATION 10] hoặc [0].
Mặc dù mọi loại ASN.1 đều có thẻ được liên kết, theo cú pháp, cũng có "Loại gắn thẻ", được tác giả ASN.1 sử dụng để chỉ định thẻ để mã hóa loại. Về cơ bản, một TaggedType đặt một tiền tố thẻ trước một loại.Ví dụ:
MyType ::= SEQUENCE {
field_with_tagged_type [0] UTF8String
}
Thẻ trong TaggedType rõ ràng hoặc ẩn. Nếu rõ ràng, điều này có nghĩa là tôi muốn thẻ gốc được mã hóa rõ ràng. Nếu ngầm định, điều này có nghĩa là tôi rất vui khi chỉ có thẻ mà tôi chỉ định được mã hóa. Trong trường hợp rõ ràng, các kết quả mã hóa BER trong một TLV lồng nhau (tag-length-value): thẻ bên ngoài ([0] trong ví dụ trên), độ dài và sau đó là TLV khác làm giá trị. Trong ví dụ này, TLV bên trong sẽ có thẻ [UNIVERSAL 12] cho UTF8String.
Thẻ có rõ ràng hay ngầm không phụ thuộc vào cách bạn viết thẻ và môi trường gắn thẻ. Ví dụ:
MyType2 ::= SEQUENCE {
field_with_explicit_tag [0] EXPLICIT UTF8String OPTIONAL,
field_with_implicit_tag [1] IMPLICIT UTF8String OPTIONAL,
field_with_tag [2] UTF8String OPTIONAL
}
Nếu bạn chỉ định không phải ngầm cũng không rõ ràng, có một số quy tắc để xác định liệu thẻ là rõ ràng hoặc ngầm (xem X.680 31). Các quy tắc này xem xét môi trường gắn thẻ được định nghĩa cho mô-đun ASN.1. Mô-đun ASN.1 có thể chỉ định môi trường gắn thẻ là các thẻ IMPLICIT, THẺ TỪ KHÓA, hoặc THẺ TỰ ĐỘNG. Nói đúng là, nếu bạn không chỉ định IMPLICIT hoặc EXPLICIT cho thẻ, thẻ sẽ rõ ràng nếu môi trường gắn thẻ là EXPLICIT và ngầm định nếu môi trường gắn thẻ là IMPLICIT hoặc AUTOMATIC. Môi trường gắn thẻ tự động về cơ bản giống với môi trường gắn thẻ IMPLICIT, ngoại trừ các thẻ duy nhất được tự động gán cho các thành viên của các loại SEQUENCE và CHOICE.
Lưu ý rằng trong ví dụ trên, ba thành phần của MyType2 đều là tùy chọn. Trong BER/CER/DER, bộ giải mã sẽ biết thành phần nào có mặt dựa trên thẻ được mã hóa (rõ ràng là tốt hơn là duy nhất).
[0] và [3] là biểu diễn các thẻ (lớp CONTEXT-SPECIFIC, các giá trị 0 & 3). Dường như bạn hiểu cách A0 mã hóa một thẻ. Giá trị thẻ của 0 không phải là hiếm. Tôi không chắc bạn đang hỏi gì. – Kevin
Tôi không hiểu mục đích của ngữ cảnh cụ thể ... Vậy ý nghĩa của [0] là gì? – Cocoanetics