BER[計算機術語]

BER[計算機術語]
BER[計算機術語]
更多義項 ▼ 收起列表 ▲

基本編碼規則,定義在 ITU-T X.209 中,是指在 ASN.1 標準(定義在 ITU-T X.208 中)中描述的數據編碼/解碼規則。基本的編碼規則可能被用於為類型值取得傳輸語法的規範,使用 ASN.1 指定在推薦 X.208 中定義的。一單個 ASN.1 對象可能有幾個等價的 BER 編碼。BER 是當前 CryptoAPI 使用的兩種編碼方法之一。

簡介

BER是一種編碼規格說明,描述如何將 ASN.1 類型的值編碼成位元組串(string of octets)的方法。
SNMP使用的編碼方法是BER(Basic Encoding Rule)。BER的數據都由三個域構成:標識域(tag)+長度域(length)+值域(value)。簡稱TLV格式。在ASN.1中,也稱為Identifier-length-content(ILC)。

基於 BER 的 ASN1 編解碼原理與設計實現

信令中繼系統是電信 7 號信令網中基於事務處理能力( Transaction CAPabilities,簡稱 TCAP) 開發的系統, 它完成香港某電信虛擬運營商和其依賴的實際運營商之間信令訊息的轉換,在不需要建立新的國際漫遊鏈路情況下,實現虛擬運營商的手機用戶國際漫遊的功能。TCAP 層的信令數據是由 ASN.1 定義的,使用 ASN.1 基本編碼規則 BER( Basic Encoding Rules, 簡稱 BER) 進行傳輸,所以需要根據BER 進行解碼和編碼。

編解碼模組內容

為了使編解碼模組具有良好的通用性和擴展性,將其設計成標準 C 語言的函式館形式,這樣可以在多種作業系統和多種程式語言中重用。ASN.1 編解碼模組分為三個部分:( 1) 簡單數據類型的編解碼函式;( 2) 記憶體函式;( 3)輔助函式。

簡單數據類型的編碼函式為外部提供統一的 API 接口。信令轉換模組利用這些函式對 TCAP 數據單元進行編碼和解碼,如果是複合類型,則分解成基本數據類型進行編碼解碼。

編碼函式形式是:

int ASNEncode_< 數據類型> ( ASNCONTEXT* pCtx, < 數據類型對應的 C 結構> * pObj, int TagType) , 將 C 結構內的數據編碼到緩衝區中。

解碼函式形式是:

int ASNDecode_< 數據類型> ( ASNCONTEXT* pCtx, < 數據類型對應的 C 結構> * pObj, int TagType) , 將緩 沖區內的數據解碼到數據結構中。

記憶體函式主要是進行記憶體的分配和管理。

輔助函式主要是進行編 解碼錯誤的處理。

數據結構

為了能建立庫函式之間的聯繫,需要跟蹤函式調用時的有關參數,如編碼解碼緩衝區的變化、運行時的錯誤信息等。所以,在每個編解碼函數裡增加一個編解碼上下文結構參數 ASNCONTEXT,以保證複合類型編解碼和記憶體處理的正確性。定義了一個初始化上下結構的函式InitContext( ASNCONTEXT * ),在聲明一個上下文結構的變數後,調用此函式上下文進行初始化,然後再調用編解碼函式。

記憶體分配和管理

一般而言,C 語言中有下面兩種方法進行記憶體分配:( 1) 在棧上分配變數,然後將變數的地址傳給指針欄位;( 2)使用標準的 malloc 和 free 兩個C 函式動態分配記憶體。第一種方法比較簡單,可以得到臨時記憶體,不再需要時可以釋放。但是,這樣很不安全,容易出現懸空指針。第二 種方法沒有這個問題,在調用完編碼函式後可以安全釋放每個元素的記憶體。但是,對每個malloc 調用都要有free 調用。對於複雜的結構,很難做到這點,可能會導致記憶體泄漏。

採用的方法是使用庫記憶體管理函式進行分配和釋放記憶體緩衝區。相比第二種方法, 其最大的優點是只需調用一個簡單的 MemFreeAll 函式就可以釋放所有分配的記憶體。具體做法是, 在上下文結構中跟蹤所有分配的記憶體, 當M emFreeAll 調用時,所有記憶體立刻釋放。另外,動態分配記憶體是從一小塊連續記憶體池中分配,同時由一個 MEM_POOL結構記錄記憶體池的起始地址、大小以及當前指針。最初,該指針指向記憶體池的開始處,分配記憶體時, 指針向前移動需要的長度。用這種方式分配的記憶體不會顯式地釋放,只有當指針重新設定為記憶體池的開始時才釋放。釋放的方法也很簡單,只要賦值操作就可完成。

BER 編碼是從緩衝區的結尾開始向前構造編碼,編碼完成後起始指針會落在緩衝區的中間。使用這樣的編碼技巧,可以方便地得到編碼後數據的起始地址和長度。

對比

在網路通信中,大多數實際網路都採用了多個製造商的設備,這些設備所採用的“局部語法” (如:硬體體系結構、程式語言定義以及具體程式的編制等 )都是不一樣的。這些差異就決定了同一數據對象在不同的計算機上被表示為不同的符號串。為了使多個製造商設備之間能夠實現互通,就必須引入“傳送語法”,它是一種標準的、與具體的網路環境無關的語法格式。對於傳送語法的要求有以下三點:( 1)必須能夠定義各種複雜的類型;( 2)必須能夠精確說明這些類型的值;( 3)需要提供一種以上的編碼規則,這種編碼規則能夠確定會話層用何種比特模式來表示套用層的數據的值。

PER與 BER的對比:

由於 BER的編碼包含了過多的冗餘信息,得網路傳輸負荷過大。ITU- T在 90年代初又制定了PER編碼。X. 691中把 PER的編碼又分為 alig nedv ariant 和 unaligned v ariant 這兩種情況。其中,unalig ned va riant的編碼都是按比特來的,各個數據項的編碼之間沒有填充的比特,因此它比 alig nedv ariant更為精簡。但這種編碼的結果沒有從位元組的邊界處開始,實現起來不方便,而且也將占用更多的CPU時間。

與 BER編碼比較,PER編碼的精簡主要來自於以下三方面:

沒有T欄位

T 欄位在編碼中似乎是一個重要部分,但實際上通常是不必要的。由於網路的通信雙方都遵循統一的網路協定,因此它們可以從數據結構中推導出特定元素的類型和標識,就可以在編碼中省略類型標識符。

長度段的編碼更加精簡

BER的長度段的編碼都是位元組,而且 BER長度的編碼不考慮具體條件; 然而 PER的長度欄位根據編碼類型的不同,有不同的單位。這些單位可以是比特、位元組、元素、字元等。 這也是 PER利用數據結構已知的優勢來減少編碼量的又一方式;而且根據具體的條件限制,PER的長度段還可以大幅度削減,譬如當數據類型的長度固定時,該數據項的長度甚至可以不編碼。 IA5String ( SIZE( 4) ): : = “ BCDA”,由於長度固定為 4,PER編碼就只對 BCDA進行編碼,共 4位元組。而 BER則還要包括 T和 L欄位,共 6位元組。

PER長度段的編碼規則也要複雜得多,這方面的論述在 X. 691中占據了相當大的篇幅。

對數字類型的編碼更加精簡

在對 Integer 等數字類型 (包括 Integ er和一些類型的長度值編碼的情況 )進行編碼時,BER採取的是直接對數值進行編碼;而 PER採取的是對數據的偏移值 ( offset)進行編碼。所謂偏移值就是實際值減去下界的值。Integer ( 123456789…123456792): : = 123456790,o ffset= 1,PER只需要對 1進行編碼,編碼結果為“ 01”,占兩個比特。而PER就要對 1234567690進行編碼,編碼結果為包括 TLC三個欄位共需要 6個位元組。這樣對於那些下界類型很大的整數,可以節省大量位元組,且編碼本身也非常簡潔。

相關詞條

相關搜尋

熱門詞條

聯絡我們