ASN 1編碼學習筆記 一

2021-05-22 19:33:25 字數 2555 閱讀 9776

1.什麼是asn.1(抽象語法記法一)?

asn.1是itu-t的乙個標準集,它用來編碼及表示通用資料型別,這些資料型別有可列印串值,八位位組串值,位串值,整數值以及用可移值方式組合而成 的其他型別序列值.簡單的說,asn.1指定了以何種方式對非平凡的資料型別進行編碼,以便其他任何平台及第三方工具都能夠解釋其內容.比如,字母a在一 些平台以ascii編碼為十進位制數值97,而在其他非ascii平台上,可能會是另外的編碼.而asn.1指定了一種編碼方式,在任何平台上,字母a的編 碼都是統一的.

2.asn.1語法.

asn.1語法遵循傳統的巴科斯正規化bnf風格.最基本的表示式如: name ::= type . 表示為定義某個名稱為name的元素,它的型別為type. 例如: myname ::= ia5string . 表示為定義了乙個名為myname的元素或變數,其型別為asn.1型別ia5string (類似於ascii字串).

2.1 asn.1顯式值(explict value).

有些時候,我們需要定義一種asn.1型別,它的子集元素包含預定義值. name ::= type (explict value) .  顯式值(explict value).必須是asn.1型別允許選擇的值,而且也必須是元素所允許的值.例: myname ::= ia5string (tom) 表示myname是字串tom的ia5string編碼. 又例如: myname ::= ia5string(tom|joe) 表示字串的值既可以是tom, 也可以是joe.

這種語法的使用是為了擴充套件確定的解碼器.例:

publickey ::= sequence    方括號中的內容和容器的元素個數都是可選項.還可以進行巢狀定義.

例:userrecord ::= sequence {

name   sequence {

first ia5string,

last  ia5string

dob     utctime

將其粗略的翻譯成c語言中的結構如下:

struct userrecord {

struct name {

char *first,

char *last

time_t dob;

將其粗略的翻譯成object pascal語言中的記錄如下(object pascal不支援巢狀記錄):

type

name = record

first : string;

last  : string;

end;

userrecord = record

aname : name;

dob    : datetime;

end;

2.3asn.1修改器

asn.1定義了各種修改器,如可選(optional),預設(default),和選擇(choice). 他們可以改變表示式的宣告.典型地用於定義一種要求編碼靈活,而定義又不繁瑣的型別.

<1>.可選(optional)。顧名思義,其表示改變乙個元素以便在編碼時它的型別是可選擇的.即編碼器可以忽略這個元素,解碼器不能假設它將出現. 但當鄰接的兩個元素具有相同的型別時,會給解碼器帶來一些問題.

定義: name ::= type optional

例如:float ::= sequence {

exponent     integer optional,

mantissa     integer,

sign             boolean

當解碼器讀取這個結構時,在它看來第乙個整數(integer)可能是exponent,也有可能認為是mantissa. 一般建議不使用這種方式定義 結構.

<2>.預設(default).預設修改器允許容器包含預設值.如果待編碼的資料值等同於它的預設值,那麼它將在傳送的資料流中被忽略.例 如:

command ::= sequence {

token         ia5string(nop) default,

parameter   integer

如果編碼器把token看成是代表字串nop,那麼序列將按照定義的那樣編碼為:

command ::= sequence {

parameter    integer

<3>.選擇(choice). 選擇修改器允許乙個元素在給定的例項中可以有多個可能值.實質上說,解碼器將嘗試所有期望的解碼演算法,直到有乙個型別符合為止.當乙個複雜的容器中包含其 他容器時,時候選擇器就十分有用了.例如:

userkey ::= sequence {

name             ia5string,

startdate       utctime,

expire            utctime,

keydata        choice {

ecckey        ecckeytype,

rsakey        rsakeytype

上例簡單的允許ecc也允許rsa金鑰的公鑰證書.

asn1學習筆記 約束

繼續看asn1語法詳解,今天主要看了約束部分,包含 1.單值約束,包含列舉型別 enumerated 如 two integer 2 day enumerated wendnesday day wednesday after ia5string aaaaaa 2.型別包含約束 frenchweeke...

asn1學習筆記 約束

繼續看asn1語法詳解,今天主要看了約束部分,包含 1.單值約束,包含列舉型別 enumerated 如 two integer 2 day enumerated monday 0 tuesday 1 wednesday 2 thursday 3 friday 4 saturday 5 sunday...

使用ASN 1協議編碼

在不同裝置節點進行通訊的時候,通常要定義乙個資料協議,用來定義要傳輸資料的資訊結構。而asn.1就是定義資料協議的一種方法。即寫乙個檔案,字尾名為 asn 例如 寫乙個檔案,檔案名叫 data.asn 檔案內容為 people sequence 即定義乙個資料結構people,包含兩個成員,乙個為位...