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,包含兩個成員,乙個為位...