?

ASN.1 的PER 分層運行庫系統的設計和實現

2020-10-20 09:13
微處理機 2020年5期
關鍵詞:編解碼數據類型編碼

高 益

(重慶航天職業技術學院電子工程系, 重慶400021)

1 引 言

ASN.1 編解碼運行庫軟件在應用ASN.1 的系統中起著極為重要的作用,是整個系統中不可缺少的一部分,被用來處理針對不同的ASN.1 編解碼規則提供不同的編解碼函數[1]。例如:BER 編解碼規則對應BER 編解碼函數,PER 編解碼規則對應PER 編解碼函數,這些具體規則對應的編解碼函數通過調用其相應的ASN.1 運行庫完成其編解碼過程[2]??芍苯诱{用這些編解碼函數完成復雜數據結構與傳輸碼之間的轉換,從而開發出實用ASN.1 的應用系統?;诖?,本研究著眼于提高編解碼運行庫系統的靈活性和移植性,以降低使用難度為目標,設計實現一種智能化編解碼系統。

2 PER 分層運行庫系統模型組成和功能

PER 的編碼原則就是用最簡單的規則得到最簡潔的編碼[3],相應地PER 的編碼規則也就更加復雜。除少數類型沿用了BER 的編碼方法外,PER 各個數據類型的編碼比BER 都精簡得多,冗余信息極少。在此可設計一個底層的函數庫,把這些共同的特征函數封裝在一起,以此大大提高運行庫的執行效率?;诓煌珹SN.1 編碼規則的共同點,設計出一個ASN.1 分層運行庫系統,其建模結構如圖1 所示。

圖1 ASN.1 分層運行庫系統模型

圖中各主要部分功能簡介如下:

底層函數庫層ASN.1 編解碼函數的很多代碼是各種類型所共用的,如果提供公共函數以供其它編解碼函數調用,就可減少不必要的代碼重復。

ASN.1 各種編解碼規則庫層在上述的公共函數庫層之上,可根據ASN.1 各種編碼規則編寫不同類型的編解碼函數庫,例如:BER 編解碼運行庫、PER 編解碼運行庫、DER 編解碼運行庫等。以此可令ASN.1 數據值編碼大為簡化。如果為每個基本的ASN.1 數據類型編寫編解碼函數,則可以提供公共的函數庫給各應用系統調用。

宏定義層把常用的代碼段定義為宏,這樣就便于定義與應用有關類型的編解碼函數。提供一部分宏定義直接供其調用,包括處理內存分配、釋放和長度計算的宏定義。

不同編解碼規則都有相同的表述數據類型的方式,可分為:簡單類型、復合類型和其它類型[4]。ASN.1 的PER 分層運行庫系統模型也隨之包括簡單、復合與其它類型的編解碼處理層。ASN.1 的PER 分層運行庫系統的總體設計框架如圖2 所示。

圖2 ASN.1 的PER 分層運行庫模型

圖中各主要部分的功能為:

簡單類型編解碼層該層位于模型的最底層,是為ASN.1 語法描述中定義的所有基本數據類型提供的編解碼函數,一個基本類型對應一套編解碼流程和一對編解碼函數。

復雜類型編解碼層該層位居中間,與其對應的是ASN.1 智能PER 編解碼系統的中間結構編解碼處理層。如此的構成,可實現直接調用,無需在運行庫中再次查找,省去了代碼的重復壓棧和出棧,提高編解碼運行庫的運行時間,同時也節約了代碼運行所占的空間。

其它類型編解碼層這一層位于運行庫系統的最上層,對除了基本類型和構造類型外的其它ASN.1 類型,即對ASN. I 中的CHIOCE 和ANY 類型,進行編解碼處理。

運行庫函數不應隨著相應協議的變化而變化,它實現的是編解碼底層的支撐函數,符合標準C,具有較好的可移植性。

3 簡單類型編解碼處理層設計實現

簡單類型編解碼處理層的接口函數的實現應基于輸入需要編碼或者解碼的數據、數據長度、輸出編解碼數據的需求[5]。先設計一個結構體RUNBuffer 用來存儲消息緩沖區的編解碼數據:

typedef struct {

char* data;

unsigned int byteIndex;

int size;

short int bitoffset;

unsigned char aligned;

}RUNBuffer;

RUNBuffer 結構體中變量data 是一個字符串指針,指向輸入數據起始的地址;變量byteIndex 是一個無符號整形,表示當前編碼結果字節的位置;變量size 是一個整型的值,表示當前緩沖區的大??;變量bitoffset 是一個短整型的值,表示當前地址偏移了多少位;變量aligned 是一個無符號的字符類型,表示當前數據是否為PER 的對齊方式。

在以下示例中,對ASN.1 基本類型的編解碼算法進行設計,重點以整型為例,詳細給出編碼算法、整型編碼模塊實現流程圖和函數編解碼實現代碼:

INTEGER 類型編解碼算法:

步驟1:判斷整數有無約束,如果沒有約束,就按照無約束編碼方式,用最少字節編碼n 的值,內容字節的前面需要長度編碼,表示n 的值占用了多少個字節。長度也用最少字節編碼。編碼成功,返回值為1,結束;如果有,則跳到步驟2。

步驟2:判斷整數約束限度到唯一值,如果是,則編碼失敗,返回值-1,結束;如果不是,則跳到步驟3。

步驟3:判斷整數約束的下限是否是無限的,如果是,則按無約束方式編碼,編碼成功,返回值1,結束;如果不是,則跳到步驟4;

步驟4:判斷整數約束的下限是否是一個有限數,如果是,則上限是一個無限數,按照半約束整數方式編碼,編碼成功,返回值1,結束;如果不是,則跳到步驟5;

步驟5:判斷整數約束的下限和上限是否都是有限數,如果不是,則編碼失敗,返回值-1,結束;如果是,則按照約束整數方式編碼,編碼成功,返回值1,結束。

INTEGER 類型編碼流程圖如圖3。

圖3 整型編碼模塊實現流程圖

4 復雜類型編解碼處理層設計實現

4.1 算法約束規則

復雜類型即為ASN.1 中的構造類型,對此可按照表1 所示的規則處理[6]。

表1 復雜類型算法約束

表中所示的這四種類型編碼算法,在Canonical PER 中和Basic PER 中,標記有DEFAULT 的成員,如果要編碼的值是缺省值,則此成員的編碼省略;而對于結構化的成員,即使它的取值是缺省值,是否被編碼仍須由以下兩點來判定:

①類型是可擴展的且取值沒有出現擴展附加部分,則SEQUENCE 的值的編碼結束;

②類型是可擴展的且取值有n 個擴展附加部分,則添加一個n 比特bitmap,對應比特取值1,表示該擴展附加部分出現。

當長度為n 的bitmap 增加一個長度指示后,編碼方式為小的非負整數的編碼。后面依次出現的擴展附加部分的編碼方式如下:

擴展附加部分是單個成員,則以open 類型來編碼,即包括長度字段和整數個字節的值字段;

擴展附加部分是由雙重方括號內全部成員組成,則擴展附加部分的值以open 類型編碼。區別在于:雙重方括號內全部成員的值均作為一個sequence類型的取值來編碼[7]。set 中的元素也可以是可選的,用關鍵字optional 來描述,若具有缺省值,用default來描述。

4.2 具體編碼算法

算法首先要判定數據的類型,如果經判定數據類型為sequence,則計算其中出現的具有可選/必選屬性的元素個數,用n 位來表示這n 個元素是否出現,若出現了,則用1 表示;若沒有出現,則用0 表示。這n 位數的順序就是元素在sequence 中出現的順序。然后按元素的出現順序和類型調用相應的編碼函數,編碼結束。

如果經判定數據類型為set,則計算其中出現的具有可選/必選屬性的元素個數,用n 位來表示,若出現,則用1 表示;若沒有,則用0 表示。這n 位數的順序就是元素在set 中出現的順序。按元素的定義順序和類型調用相應的編碼函數,編碼結束。

SEQUENT OF 數據類型編碼過程和SEQUENT相同。而SET OF 數據類型編碼過程和SET 相同。

以下為SEQUENCE 類型的編碼函數:

int SEQUENCE_encode_per(asn_per_constraints_t*constraints,

asn_codec_max*opt_codec_max,

void*sptr,asn_per_outp_t*po)

5 其它類型編解碼處理層設計實現

除了上述類別外,ASN.1 中還有CHIOCE 和ANY 類別,其中ANY 表示任意類型,CHIOCE 表示一個或多個可選項的聯合,如下所示[8]:

CallEventDetail::=CHOICE{

mobileOriginatedCall

mobileTerminatedCall

LocationService

}

對于CHOICE 類別,編碼數據時一次只能選定一個元素。CHOICE 類型的解碼函數為:

int CHOICE_decode_per(asn_codec_max* opt_codec_max,

asn_per_data *pd, asn_per_constraints *constraints,

void **buf)

6 結 束 語

ASN.1 的PER 分層運行庫系統模型的提出,是考慮到目前運行系統存在的弊端,模型嘗試解決傳統ASN.1 運行系統的瓶頸問題,也給出了使用C 語言設計一個ASN.1 智能PER 分層運行庫系統的實現過程。詳細分析PER 編解碼算法,從長度域編解碼算法到基本類型編碼算法,從基本編解碼處理層的實現,到構造類型編解碼處理層的實現,通過PER 可見子類型約束和宏的使用對代碼進行了優化。設計實現的軟件可以完成簡單ASN.1 協議的編解碼功能,對ASN.1 相關系統有較高的應用價值。為未來實現ASN.1 工具的其他功能打下了基礎,在此基礎上可結合其他應用語言的特性實現完整的ASN.1 運行庫功能。

猜你喜歡
編解碼數據類型編碼
生活中的編碼
《全元詩》未編碼疑難字考辨十五則
如何理解數據結構中的抽象數據類型
子帶編碼在圖像壓縮編碼中的應用
為多重編解碼世界做好準備
大型民機試飛遙測視頻編解碼方法研究
Genome and healthcare
基于SeisBase模型的地震勘探成果數據管理系統設計
線上眾籌產品的特征分析與研究
相似度計算及其在數據挖掘中的應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合