轉自: http://wmfbravo.blog.163.com/
感謝: wmfbravo
本章主要介紹BER和PER兩種編碼規則及其衍生規則。
3.3 PER
BER編碼因其在大小上的開銷過大而受人詬病,和真實編碼數據相比,平均需要增加50%的額外數據。正式這個原因推動了PER(Packed Encoding Rules)的誕生。相同協議,PER編碼與BER相比在大小上至少有40%到60%的改進。因而在VoIP、視頻電話、多媒體以及3G等需要高速數據傳輸的領域有廣泛應用。
3.3.1 基本規則
PER編碼規則的黃金定律為:“obtain the most compact encoding using encoding rules as simple as possible”。
與BER中遞歸使用三元組TLV<Tag, Length, Value>不同,PER的格式為:’[P][L][V]’ <optional Preamble, optional Length, optional Value>,這里PLV中每個域都不再是八位組串而是比特串。
因為Length可以省略(甚至Value也可以省略),那么就不能從編碼中得知邊界,所以解碼器必須知道抽象描述才能正確解碼。PER編碼中沒有Tag域,因此PER不再缺省支持擴展,必須明確在描述中添加擴展符。
只有當長度沒有被SIZE固定或者數據長度很重要的情況下,才對Length進行編碼;對SEQUENCE或者SET類型的值編碼時,匯總前面增加個bitmap來標識可選成員是否出現;同樣,在編碼CHOICE的被選擇成員前,會增加一個序號指示其位置。
和BER相比,PER使得編解碼器處理時間相對要少(但達不到兩倍的處理速度),傳輸速度更快。
3.3.2 四種變形
PER編碼規則可以分為基本的(Basic)和規范的(Canonical)兩類,每一類又可以分為對齊(Aligned)和不對齊(Unaligned)兩種。規范形式的優勢在CER和DER中已經討論過了,主要用在中繼接力系統和安全系統等使用數字簽名的場合。在基本形式中,一個抽象值可能有多個PER編碼。但是,在有限測試后,我們知道基本形式編碼器要比規范形式編碼器速度更快。
對齊方式下,為了保持八位組對齊,可以增加值為0的比特。不對齊方式則編碼更為緊湊,但是在編解碼時需要花費更多的處理時間。不對齊方式下,不會檢查八位組的對齊情況,只在整個數據編碼結束后,才進行補位。
注意對齊和不對齊兩種方式不能互通,即只能用同種的解碼器解碼同種編碼器編碼后的碼流。在四種變形中,基本不對齊方式編碼是最緊湊的。按照緊湊性降低的順序,后續依次為:規范不對齊方式,基本對齊方式和規范對齊方式。
在表示層傳輸上下文協商中,我們需要用Object Identifier指明具體采用的是哪種變形。具體值,請參考第二章中Object Identifier注冊樹。
3.3.3 PER可見子類型約束
為了最大限度的壓縮編碼,PER需要依賴ASN.1描述中的子類型約束。約束增加的越具體,PER越能得到更優化的編碼。而且PER會使用到的約束都是經常使用的約束,這樣也使得PER編譯器容易實現。此外,這些約束都是編譯器在編譯過程中“靜態”使用的,不會增加實際編解碼過程處理時間。
我們稱這類約束為PER可見約束(PER-Visible Constraints),它們只包含下表所列:
Table 3-3 PER可見約束
類型 |
PER可見約束 |
BOOLEAN |
無 |
NULL |
無 |
INTEGER |
單值約束、值域約束、類型包含約束、約束組合、約束擴展 |
ENUMERATED |
無 |
REAL |
無 |
BIT STRING、OCTET STRING |
SIZE約束、約束組合、約束擴展 |
OBJECT IDENTIFIER |
無 |
NumericString、PrintableString、VisibleString、ISO646String、 IA5String、UniversalString、 BMPString |
FROM約束、SIZE約束、類型包含約束、約束組合、SIZE約束中的擴展 |
not-known-multiplier character string types |
無 |
GeneralizedTime、UTCTime、ObjectDescriptor |
無 |
open types |
無 |
SEQUENCE、SET |
無 |
SEQUENCE OF、SET OF |
SIZE、約束組合、約束擴展 |
CHOICE |
無 |
EXTERNAL |
無 |
EMBEDDED PDV、CHARACTER STRING |
WITH COMPONENTS |
open types指引用到一個類型域、一個可變類型的值域、或者一個可變類型值集合域。即引用到信息對象類中的類型。
不在上表中的,都不是PER可見約束, PER編譯器也就不做相應優化。
3.3.4 數的編碼
我們考察一個非負數的四種形式的編碼,因為自然數常出現在長度域L、bitmap的大小、CHOICE中的序號以及INTEGER類型邊界中。
對於INTEGER類型,PER可見約束之一是值域約束。對於有值域約束(bmin..bmax)的值n,如果下邊界bmin足夠大,PER編碼n- bmin的代價就更小。如下:
Figure 3-26 有約束自然數的基本編碼規則
I. 有約束數編碼
有約束指值域的上、下邊界都有限。如果d=1,即只有一個值,則收、發雙方都知道,那么就沒有編碼的必要。
在對齊方式下:∞
l 當2≤d≤255,n- bmin的編碼占用log2d個比特。這些比特添加在待發送比特域之后,不進行八位組對齊,不編碼L;
l 當d=256,n- bmin的編碼占用一個八位組,不編碼L;
l 當257≤d≤65,536,n- bmin的編碼占用兩個八位組,不編碼L;
l 當65,537≤d,n- bmin的編碼占用log256d個八位組,並且在前面增加L的編碼。
在不對齊方式下:
n- bmin的編碼占用log2d個比特,不編碼L。
II. 半約束數編碼
半約束指值域沒有上邊界(上邊界為+∞)。
n- bmin的編碼占用log256d個八位組,並且在前面增加L的編碼。
III. 無約束數編碼
無約束指值域沒有下邊界(即使存在上邊界)。
按照BER中整數的編碼方式編碼,並且在前面增加L的編碼。
IV. 常見小自然數編碼
這種情況經常出現在對表征SEQUENCE、SET類型可選成員的Bitmap長度進行編碼時;或者CHOICE類型序號編碼時。這種長度相當小,但是卻沒有一種限定。
l 當0≤n≤63時,n以6個比特編碼,並且在前面增加一個0比特(八位組不對齊):
l 當64≤n時,n以半約束數方式編碼,下邊界為0,並且在前面增加一個1比特:
3.3.5 長度域編碼
與BER中長度域表征編碼的八位組數不同,在PER的長度域出現下,如果編碼為比特串則表征比特位數;如果編碼為八位組串(OCTET STRING和open類型)則表征八位組個數;如果編碼為known-multiplier character string則表征字符數;如果是SEQUENCE OF或者SET OF則表征成員個數。
每當ASN.1描述中 對類型通過(SIZE(lmin..lmax))做大小限定時(lmax可以是+∞),長度l的值要按照3.3.4 中的規則編碼。作為特例,當lmin =lmax≤65,535時,長度不需要發送,因為解碼器知道該長度。
對齊方式下:
l 當l是一個bitmap的長度,l-1作為常見小自然數編碼;
l 當lmax≤65,535,l作為有約束的數編碼(約束為(lmin..lmax));
l 當65,535≤lmax,或者lmax是無窮大:
- 當l≤127,l以一個八位組編碼(八位組對齊),最高比特位為0;
-當128≤l≤16,383,l以兩個八位組編碼(八位組對齊),最高兩個比特位為10;
-當16,384≤l,整個編碼以f*16K為單位分割(f取值為1,2,3或者4)。除最后的片段外,其余每段,長度都以一個八位組編碼,最高兩個比特位為11。如果編碼恰好時16K的整倍數,則在最后補充一個全空的八位組;否則最后一個片段按照前兩條進行編碼。例如占147,457個單元的編碼可以為:
不對齊方式下:
l 當l是一個bitmap的長度,l-1作為常見小自然數編碼;
l 當lmax≤65,535,l-lmin以占用log2(lmin-lmax+1)個比特編碼;
l 當65,534≤lmax-lmin,或者上邊界為無窮大:
-當l≤127,l以八比特編碼,最高比特位為0;
-當128≤l≤16,383,l以十六比特編碼,最高兩個比特位為10;
-當16,384≤l,編碼方式域對齊類似,但是不是八位組對齊的。
當類型有可擴展的SIZE約束,並且待發送值不在該約束擴展的根部分,則長度l作為半約束數編碼(即lmin=0, lmax =+∞)。
3.3.6 各類型編碼
I. BOOLEAN
以一個比特編碼,1為TRUE,0為FLASE。
直接編碼,不編碼長度,也不做八位組對齊。
II. NULL
不編碼。
如果NULL是作為CHOICE的一個選項或者SEQUENCE、SET可選成員值出現,則已經有bitmap能表征。
III. INTEGER
假設INTEGER類型擁有有效的值域范圍(bmin..bmax),當描述中INTEGER類型有至少一個可擴展的PER可見約束(PER-Visible Constraint),在編碼時會在前面增加一個前導(Preamble)比特(不考慮八位組是否對齊)。當INTEGER類型的值在擴展的根部分,該比特為0;否則該比特為1。
在編碼n- bmin過程中,如果需要編碼L(前面討論過),則增加長度域L的編碼。長度L的約束為(1..lmax),其中lmax =log2bmax。
如果待發送值n屬於約束的擴展部分,則長度按照無約束自然數方式編碼,如值:
v INTEGER (3..6, ..., 8..10) ::= 8
的對齊方式編碼為:
IV. ENUMERATED
如果該ENUMERATED類型不是可擴展的,則先按照數值大小做升序排列,然后以0為起點,步長為1給每個成員編上序號。對該類型的值編碼時,只將序號以值域約束(0..Indexmax)編碼。如:
v ENUMERATED {orange(56), green(-2), red(2476)} ::= orange
的PER編碼為“01”(因為此時為Indexmax 2,需要兩個比特)。
如果該ENUMERATED類型是可擴展的,那么要在編碼前增加一個前導(Preamble)比特。當值在擴展的根部分時,該比特為0;否則該比特為1。同時對擴展部分的成員重新進行編號,起點仍為0,步長為1。編碼時對值在根部分的情況,就和該類型是不可擴展時一樣;值在擴展部分的情況,對序號按照自然數方式編碼。如:
v1 ENUMERATED {orange(56), green(-2), red(2476), …, yellow}
::= orange
的PER編碼仍然為“01”;而
v2 ENUMERATED {orange(56), green(-2), red(2476), …, yellow, purple}
::= yellow
的PER編碼則為“10000000”。
V. REAL
對值的編碼規則和CER或者DER相同(而且是八位組對齊的),並且在前面增加長度域L的編碼。這里L表征的是八位組數。
VI. BIT STRING
如果該BIT STRING類型有可擴展的PER可見大小約束(PER-Visible Size Constraint),那么要在編碼前增加一個前導(Preamble)比特。當值在擴展的根部分時,該比特為0;否則該比特為1。
對於有大小約束(SIZE(lmin..lmax))的BIT STRING類型:
l 當lmin=lmax≤16比特,不發送長度,直接編碼(不是八位組對齊的);
l 當17≤lmin=lmax≤65,536比特,不發送長度,直接編碼(在八位組對齊方式下是八位組對齊的);
l 當65,537≤lmin=lmax,長度按照3.3.5 中約定編碼;而值按照需要進行分段;
l 當lmin≠lmax(或者沒有有效的大小約束),長度按照3.3.5 中約定編碼;而值按照需要進行分段。
如果BIT STRING類型包含一個命名位置列表,所有結尾的0比特都被去掉;此外,為了滿足大小約束,可以增加或者刪除結尾0比特來達到最小的長度。
VII. OCTET STRING
與BIT STRING規則相同,不過長度域L表征的是八位組的個數而不是比特數。
VIII. OBJECT IDENTIFIER
值的編碼規則與BER相同,前面需要增加長度域L的編碼。
IX. RELATIVE-OID
值的編碼規則與BER相同,前面需要增加長度域L的編碼。
X. 字符串與日期
首先描述known-multiplier字符串類型,如果這種類型是受約束的,帶了一個形如(SIZE(lmin , lmax))的有效的size約束和一個形如(FROM("c1"|"c2"|...|"cn"))的有效的字符約束。如果FROM約束是可擴展的,則有效的字符約束就包括了父類型包含的所有的字符。
如果SIZE約束是可擴展的,則在bit-field上加一個比特。如果串長屬於擴展根的范圍內,則該比特等於0,否則該比特等於1。記住,如果FROM約束中包含了可擴展的符號,則該約束對於PER不可見,即不會改變擴展比特的取值。
PER壓縮known-multiplier字符串類是基於有效的字符約束的。假設n是有效字符約束中字符的個數,b = [log2 n], c = [log2 b],則每個字符在aligned變體中被編碼成B = 2 c 個比特(大於b的最小的2的次方),而在unaligned變體中被編碼成B = b 個比特。設vmin 和vmax 分別是("c1"|"c2"|...|"cn")對應的最小和最大的字符值。
如果vmax≤ 2B -1, 即所有的系列里的("c1"|"c2"|...|"cn")都可以用B個比特來編碼,串中的每個字符都可以作為在區間(vmin .. vmax)之間的一個整數來編碼。這就避免了給字符重新排序賦值。否則,字符序列("c1"|"c2"|...|"cn")按照標准[ISO646] 或 [ISO10646-1]中定義的順序加索引,索引從0開始,每次加1。這個新的索引號以B個比特來編碼和發送。
如果字符串的長度是固定的(lmin = lmax)並且小於64K,則長度字段L就不需要了,在aligned變體情況下,只有當 B ×lmax ≥ 17 時才需要octet - aligned。.
如果字符串的長度不固定或者長度雖然固定但大於64K,則長度字段按照章節3.2 編碼,然后附着到碼流中(在在aligned變體情況下,只有當 B ×lmax ≥ 17 時才需octet - aligned)。
例如,字符串
v IA5String (FROM ("ACGT")^SIZE(3)) ::= "TAG"
被編碼成 11 00 10 。而字符串
v IA5String ::= "TAG"
在unaligned變體情況下被編成(注:IA5String的vmin 和vmax分別為0和127):
在aligned變體情況下被編成(下面的方框表示從整數個字節開始)
日期類型 GerneralizedTime和UTCTime 的編碼方式在basic PER情況下與BER相同,在canonical PER情況下與DER相同。
對於不屬於known-multiplier的字符串類型,所有的約束對PER都是不可見的。它們的編碼方式在basic PER情況下與BER相同,在canonical PER情況下與DER相同。長度字段L作為一個無約束整數加在前面。
對於known-multiplier字符串類型在定義中最小和最大的字符值請參考下表:
Table 3-4 known-multiplier字符串的最小最大字符值
類型 |
vmin |
vmax |
NumericString |
32 |
57 |
PrintableString |
32 |
122 |
VisibleString |
32 |
126 |
IA5String |
0 |
127 |
BMPString |
0 |
216 -1 |
UniversalString |
0 |
232 -1 |
XI. Open類型
一個open類型的值實際上是一個任意類型的值,這個類型對於發送方和接收方而言都是已知的。因此這個值就被編成它的有效類型而沒有類型的指示。通常情況下,這個值的類型已經在前面發送過了,解碼器會存儲類型到關聯表中,而后在收到open類型能夠的值后根據關聯表就可以查詢到對應的類型進行解碼。
相應的值編碼后,不是整數個字節的情況補充值為'0'的比特位以便使該碼流為整數個字節(假設為n)。並在頭部加上長度字段L表示字節數n,L作為無約束整數進行編碼。
XII. SEQUENCE
首先,如果有COMPONENTS OF語句,則由相應的類型進行替換。
如果SEQUENCE類型是可擴展的,則在編碼的頭部加上一個比特的bit-field,如果SEQUENCE的取值中有屬於擴展附加部分的成員,則該比特等於1,否則等於0。
如果SEQUENCE的定義中在擴展根部(extension root)有"n"個成員被置為OPTIONAL或DEFAULT,則在編碼頭部再添加"n"個比特的bit-field,該bit-field從第一個bit開始,依次指示被標記為OPTIONAL或DEFAULT的成員是否出現。如果為1,則該成員出現,否則沒有出現。如果“n”小於64K,則這個 bit-field 應該直接添到碼流中。如果"n"大於等於64K, 按照前面提到的處理方法把“n”個bit的bit-field分段並添加到域序列中,前面的長度字段L就作為一個有約束的整數編碼,而約束的上限和下限都等於n。
以上為導言(preamble)部分,導言之后是各成員類型的編碼,依次出現。
在canonical PER中,對於標記有DEFAULT的成員,如果要編碼的值就是缺省值,那么這個成員的編碼省略;在basic PER中,如果序列中標記為DEFAULT的成員是一個簡單類型,當它的值為缺省值時,它的編碼應省略。而對於結構化的成員(SEQUENCE, SET, SEQUENCE OF, SET OF, CHOICE) ,即使它的取值是缺省值時,是否被編碼是由發送方來決定的。
如果類型是可擴展的但取值中沒有出現擴展附加部分,則該SEQUENCE的值的編碼已經結束。
如果類型是可擴展的並且取值中有p個擴展附加部分(雙重方括號內的所有成員只當作一個附加擴展部分),則添加一個p個比特的bit-map,對應的比特取值為1則表示該擴展附加部分出現,否則就沒有出現。為長度"p"的bit-map增加一個長度指示,編碼方式為一個通常的小的非負整數的編碼。
以后,依次出現的是各擴展附加部分的編碼值。
擴展附加部分的編碼方式如下:
l 如果該擴展附加部分是單個的成員,則作為open類型來編碼,即包括長度字段和整數個字節的值字段。
l 如果該擴展附加部分是由雙重方括號內的所有成員組成的,則該擴展附加部分的值作為open類型來編碼。與上面不同的是:雙重方括號內的所有成員的值被當成一個SEQUENCE類型的取值來編碼,編碼方式參見本節上段。
注意在SEQUENCE類型的值沒有包括長度字段,因為根據擴展根部的可選成員對應的bit-map和擴展附加部分對應的bit-map使解碼器推斷出成員是否存在。
XIII. SET
SET類型的擴展根部(extension root)的成員是按照canonical order來排序的,具體法則如下:
1) 首先按標簽類型排序,按照UNIVERSAL,APPLICATION,context-specific,PRIVATE四種類型依次排序,UNIVERSAL標簽類型的元素在最前,PRIVATE標簽類型的元素在最后;
2) 在標簽類型內部,按照標簽值的大小排序,小的在前,大的在后。
在排序過程中如果發現某個成員是沒有標簽的CHOICE類型,則該CHOICE類型的標簽值就會等於其所有選項中標簽的最小值。在CHOICE類型嵌套的情況下亦是如此。
如果SET類型是可擴展的且SET類型的值中有擴展附加部分,則擴展附加部分的排序按照其協議定義時的順序,不做改動(因為在新增擴展附加部分時對應的標簽必須符合canonical order)。
經過上述的排序后,SET類型的編碼就按照SEQUENCE類型的編碼。
XIV. SEQUENCE OF
顯式PER限制僅僅對SEQUENCE OF類型的成員個數有效。
假設成員數目的上限為"ub",下限為"lb"。如果沒有上限或者上限值ub大於等於64K,就認為ub不確定;如果沒有下限,"lb"置為0。假設實際的SEQUENCE OF的成員數量為“n”,編碼按如下規則進行:
1) 如果有size約束且該約束可擴展,則在碼流上添加一個1比特的bit-field(不需要octet-aligned)。 如果元素的個數屬於約束的根部則這個比特等於0,反之該比特等於1。在前一種情況下,調用節3.2為生成的編碼增加一個半約束數的長度指示,長度值等於n。
2) 如果成員值的數目固定且小於64K,則沒有長度指示,SEQUENCE OF的各成員的值的編碼依次填充到生成的編碼中去。
3) 其它情況,增加長度指示成員值的數目。如果"ub"存在,則長度指示作為約束數編碼,否則作為半約束數類型的整數編碼。
需要注意的是在給每個成員編碼時,在aligned變體情況下需要octet-aligned。
XV. SET OF
在basic variant情況下,把每個SET類型的元素按順序編碼即可,而不需要調換順序。而在canonical variant情況下需要先把各SET中的元素按canonical order進行排序再編碼,並在必要的時候需要做一些調整,如加上一些'0' bit以形成整數個字節,或加上值為0的字節以使短部分和長的部分長度一致。
XVI. CHOICE
先給CHOICE的各個選項標上索引(index),過程如下:
1) 對於CHOICE類型的根部(root)的選項,先按照canonical order對各選項進行排序,然后給排序后的選項標上索引,第一個選擇項索引為0,第二個為1,直至根部的最后一個。 如果嵌套了沒有標簽的CHOICE類型,則該類型的標簽是其擇項中的最小的那個標簽。
2) 如果CHOICE類型是可擴展的,並且有擴展附加選項,則給擴展附加選項也分別標上索引,第一個擴展附加選項的索引為0,第二個為1,直至擴展部分的最后一個。(標索引之前不需要對這些選項進行排序,是因為在新增擴展附加選項時對應的標簽必須符合canonical order)。
在索引標完后,就可以對CHOICE類型的值進行編碼,過程如下:
1) 如果僅有一個選擇項,如果選擇了該選擇項的話,不要對索引進行編碼。
2) 如果CHOICE類型是可擴展的,則在碼流上加一個比特的bit-field(不需要octet-aligned)。如果該值屬於擴展附加選項,則 該比特等於1,否則等於0。
3) 如果沒有擴展標記,或者有擴展標記但選項在CHOICE類型的根部,則選項的索引值就作為一個INTEGER來編碼(約束為0..n,假設n為根部的最大索引值),然后是選項的值的編碼。
4) 如果有擴展標記且選項是CHOICE類型的擴展附加選項,則該索引被當作一個通常的小的非負整數進行編碼,其"lb"置為0。把選項的值當作open類型進行編碼。
XVII. Tagged Type
因為PER不是隱式支持Tag的,所以一個有Tag類型的值按照該類型的編碼規則進行編碼。在ASN.1模塊內,特定Tag上的限制要遵守;建議在模塊頭的聲明中增加AUTOMATIC TAGS,這不會影響已有的限制。
XVIII. EXTERNAL
略。
XIX. INSTANCE OF
一個INSTANCE OF類型的值按照其等效SEQUENCE類型值進行編碼。
XX. EMBEDDED PDV或者CHARACTER STRING
如果EMBEDDED PDV或者CHARACTER STRING類型有WITH COMPONENTS約束,該約束限制可選項syntaxes是兩個預定義object identifier的序列(即對收、發雙方抽象語法、傳輸語法都明確);或者限制成員identification選項為fixed,則PER編碼中嵌入數據作為OCTET STRING類型編碼。
如果成員identification沒有按照前面兩種方式之一約束,則這兩種類型的值需要按照等效的SEQUENCE類型值進行編碼。
XXI. Value Set
編碼一個有值域Value Set約束類型的值時,值域被當作有該值域約束的類型看待。如值域:
Set1 INTEGER(1..20) ::= {1 | 5 | 7}
被等同作:
Set1 ::= INTEGER(1..20)(1|5|7)
XXII. Information Objects 與 Information Object Sets
信息對象和信息對象集合不編碼。傳輸其中信息的方式,是在類型或者值中引用信息對象或者信息對象集合。編碼時,按照所在值的編碼規則進行編碼。
3.3.7 一個完整例子
還是以BER中的例子,來看其對應的PER編碼。
ASN.1描述:
MyHTTP DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
GetRequest ::= SEQUENCE
{
header-only BOOLEAN,
lock BOOLEAN,
accept-types AcceptTypes,
url Url,
...
}
AcceptTypes ::= SET
{
standards BIT STRING {html(0), plain-text(1), gif(2),
jpeg(3)} (SIZE (4)) OPTIONAL,
others SEQUENCE OF VisibleString (SIZE (4))
OPTIONAL
}
Url ::= VisibleString (FROM ("a".."z"|"A".."Z"|"0".."9"|"./-_~%#"))
v GetRequest ::=
{
header-only TRUE,
lock FALSE,
accept-types { standards {html,plain-text} },
url "www.asn1.com"
}
END
相應對齊方式的PER編碼結果為:
不對齊方式的PER編碼結果為:
3.4 其它編碼規則
3.4.1 LWER
Light Weight Encoding Rules (LWER),1985年有德國發起,1988年由法國繼續推進。其目的是為了在BER基礎上構造處更為輕量級編碼規則,隨着PER的出現和成熟,於1997年放棄。
3.4.2 BACnet
BACnet (Building Automation and Control Network)是由美國加熱、冷凍、空調工程師協會(ASHRAE-American Society of Heating, Refrigerating and Air-conditioning Engineers)設計。用於在Internet上傳輸從分布在各地,監控集中加熱、通風、空調或者煙霧報警器的控制設備來的數據。
現在BACnet編碼規則,結合ECN(X.692, Encoding Control Rule),使得可以使用一個通用的工具來生成編解碼規程。
BACnet編解碼規則具體細節,可以訪問網站:
http://www.bacnet.org
或者:
ftp://ftp.bacnet.org/Encoding.doc
3.4.3 OER
應用很少,略。
具體信息可以訪問:http://www.viggen.com/ntcip/documents/oer.rtf
3.4.4 SER
SER(Signaling specific Encoding Rules)是由法電研發部(France Telecom R&D)和諾基亞(Nokia)聯合開發的。其主要目的是想通過合適的編譯器,為原本不是用ASN.1描述的協議,通過重新描述能自動生成編解碼器。這類協議主要是在ASN.1出現之前就有的,如七號信令的協議,GSM接入協議等。
據悉,國內電信設備商H,基於同樣目的也設計了類似編碼規則。但和上述的工作原理有差異。
因專利保護關系,這些規則的詳細內容不得而知。
此外,自1999年后,ASN.1中引入了XML。相應的有了XER(XML Encoding Rules)。