ans.1是一種跨平台的編碼格式,網上關於ans.1協議的實現一抓一大把,openssl裡面有ans.1的實現,大家感興趣的可以去看看。我們這裡主要是講講ans.1編碼,這樣大家看**的時候更容易理解一些,它的組成有點類似xml和tlv有多層的巢狀。
asn.1語法遵循傳統的巴科斯正規化bnf風格.
最基本的表示式如下:
name ::= type .
表示為定義某個名稱為name的元素,它的型別為type.
例如:
myname ::= ia5string .
表示為定義了乙個名為myname的元素或變數,其型別為asn.1型別ia5string (類似於ascii中字串型別)。
asn.1 語法
顯式值(explicit value)
myname ::= ia5string(****).
這就是為myname這個變數賦給了乙個顯式的ia5string格式的值 ****。
容器(container)
容器是值乙個包含了其他相同或者不同型別元素的資料型別(例如序列值sequence或集合值set型別).目的是為了組合一些複雜的資料型別集.asn.1規範定義了4種容器型別:序列,單一序列(sequence of),集合和單一集合(set of).雖然它們意義不同,但是語法是一樣的.
name ::= container
方括號中的內容和容器的元素個數都是可選項.還可以進行巢狀定義.
例: userrecord ::= sequence ,
dob utctime
}對應c語言結構體就是:
struct userrecord
; time_t dob;
};2.3asn.1修改器
asn.1定義了各種修改器,如可選(optional),預設(default),和選擇(choice). 他們可以改變表示式的宣告.典型地用於定義一種要求編碼靈活,而定義又不繁瑣的型別。
<1>.可選(optional)其表示改變乙個元素以便在編碼時它的型別是可選擇的(即編碼器可以忽略這個元素),解碼器不能假設它將出現.但當鄰接的兩個元素具有相同的型別
時,會給解碼器帶來一些問題.
定義:
name ::= type optional
例如:
float ::= sequence
當解碼器讀取這個結構時,在它看來第乙個整數(integer)可能是exponent,也有可能認為是mantissa.一般建議不使用這種方式定義結構。
<2>.預設(default)修改器允許容器包含預設值.如果待編碼的資料值等同於它的預設值,那麼它將在傳送的資料流中被忽略.
例: command ::= sequence
如果編碼器把token看成是代表字串nop,那麼序列將按照定義的那樣編碼為:
command ::= sequence
<3>.選擇(choice)改器允許乙個元素在給定的例項中可以有多個可能值.實質上說,解碼器將嘗試所有期望的解碼演算法,直到有乙個型別符合為止.
當乙個複雜的容器中包含其他容器時,時候選擇器就十分有用了.
例如:userkey ::= sequence
} 上例簡單的允許ecc也允許rsa金鑰的公鑰證書.
ANS1編碼詳解(二) 編碼規則
基本編碼規則 basicencodingrules asn.1的基本編碼規則定義了一種或多種把任意asn.1 值表示成位元組字串的方法,縮寫為ber。當然還有其它的方法,但是ber是osi中轉換這些值的標準 使用ber,乙個asn.1的值有三種編碼方法,選擇哪種取決於值的型別和值的長度是否已知。這三...
Python基礎1 基礎語法和資料型別
a 第乙個字元必須是 字母或下劃線,其他的部分由字母數字和下劃線組成 b 識別符號分大小寫。c 可以用中文作為變數名,非ascii識別符號也是允許的了 但推薦用英文,避免麻煩 d 識別符號不能用關鍵字,關鍵字有 false one true and as assert break class con...
XML基礎(1) 語法規範和中文編碼
xml檔案以xml字尾名結尾。xml檔案需要使用xml解析器去解析。瀏覽器內建了xml解析器。標籤 1 xml標籤名稱區分大小寫。2 xml標籤一定要正確配對。3 xml標籤名中間不能使用空格 4 xml標籤名不能以數字開頭 5 注意 在乙個xml 文件中,有且僅有乙個根標籤 屬性 語法 name ...