-
BER
(計算機術語)
鎖定
- 中文名
- 基本編碼規則
- 外文名
- Basic Encoding Rules
- 解 釋
- 一種編碼規格説明
目錄
BER簡介
BER是一種編碼規格説明,描述如何將 ASN.1 類型的值編碼成字節串(string of octets)的方法。
SNMP使用的編碼方法是BER(Basic Encoding Rule)。BER的數據都由三個域構成:標識域(tag)+長度域(length)+值域(value)。簡稱TLV格式。在ASN.1中,也稱為Identifier-length-content(ILC)。
SNMP使用的編碼方法是BER(Basic Encoding Rule)。BER的數據都由三個域構成:標識域(tag)+長度域(length)+值域(value)。簡稱TLV格式。在ASN.1中,也稱為Identifier-length-content(ILC)。
BER基於 BER 的 ASN1 編解碼原理與設計實現
信令中繼系統是電信 7 號信令網中基於事務處理能力( Transaction CAPabilities,簡稱 TCAP) 開發的系統, 它完成香港某電信虛擬運營商和其依賴的實際運營商之間信令消息的轉換,在不需要建立新的國際漫遊鏈路情況下,實現虛擬運營商的手機用户國際漫遊的功能。TCAP 層的信令數據是由 ASN.1 定義的,使用 ASN.1 基本編碼規則 BER( Basic Encoding Rules, 簡稱 BER) 進行傳輸,所以需要根據BER 進行解碼和編碼。
[1]
BER編解碼模塊內容
為了使編解碼模塊具有良好的通用性和擴展性,將其設計成標準 C 語言的函數庫形式,這樣可以在多種操作系統和多種編程語言中重用。ASN.1 編解碼模塊分為三個部分:( 1) 簡單數據類型的編解碼函數;( 2) 內存函數;( 3)輔助函數。
編碼函數形式是:
int ASNEncode_< 數據類型> ( ASNCONTEXT* pCtx, < 數據類型對應的 C 結構> * pObj, int TagType) , 將 C 結構內的數據編碼到緩衝區中。
解碼函數形式是:
int ASNDecode_< 數據類型> ( ASNCONTEXT* pCtx, < 數據類型對應的 C 結構> * pObj, int TagType) , 將緩 衝區內的數據解碼到數據結構中。
內存函數主要是進行內存的分配和管理。
BER數據結構
為了能建立庫函數之間的聯繫,需要跟蹤函數調用時的有關參數,如編碼解碼緩衝區的變化、運行時的錯誤信息等。所以,在每個編解碼函數里增加一個編解碼上下文結構參數 ASNCONTEXT,以保證複合類型編解碼和內存處理的正確性。定義了一個初始化上下結構的函數InitContext( ASNCONTEXT * ),在聲明一個上下文結構的變量後,調用此函數上下文進行初始化,然後再調用編解碼函數。
[1]
BER內存分配和管理
一般而言,C 語言中有下面兩種方法進行內存分配:( 1) 在棧上分配變量,然後將變量的地址傳給指針字段;( 2)使用標準的 malloc 和 free 兩個C 函數動態分配內存。第一種方法比較簡單,可以得到臨時內存,不再需要時可以釋放。但是,這樣很不安全,容易出現懸空指針。第二 種方法沒有這個問題,在調用完編碼函數後可以安全釋放每個元素的內存。但是,對每個malloc 調用都要有free 調用。對於複雜的結構,很難做到這點,可能會導致內存泄漏。
[1]
採用的方法是使用庫內存管理函數進行分配和釋放內存緩衝區。相比第二種方法, 其最大的優點是隻需調用一個簡單的 MemFreeAll 函數就可以釋放所有分配的內存。具體做法是, 在上下文結構中跟蹤所有分配的內存, 當M emFreeAll 調用時,所有內存立刻釋放。另外,動態分配內存是從一小塊連續內存池中分配,同時由一個 MEM_POOL結構記錄內存池的起始地址、大小以及當前指針。最初,該指針指向內存池的開始處,分配內存時, 指針向前移動需要的長度。用這種方式分配的內存不會顯式地釋放,只有當指針重新設置為內存池的開始時才釋放。釋放的方法也很簡單,只要賦值操作就可完成。
BER對比
在網絡通信中,大多數實際網絡都採用了多個製造商的設備,這些設備所採用的“局部語法” (如:硬件體系結構、程序語言定義以及具體程序的編制等 )都是不一樣的。這些差異就決定了同一數據對象在不同的計算機上被表示為不同的符號串。為了使多個製造商設備之間能夠實現互通,就必須引入“傳送語法”,它是一種標準的、與具體的網絡環境無關的語法格式。對於傳送語法的要求有以下三點:( 1)必須能夠定義各種複雜的類型;( 2)必須能夠精確説明這些類型的值;( 3)需要提供一種以上的編碼規則,這種編碼規則能夠確定會話層用何種比特模式來表示應用層的數據的值。
[2]
PER與 BER的對比:
由於 BER的編碼包含了過多的冗餘信息,得網絡傳輸負荷過大。ITU- T在 90年代初又制定了PER編碼。X. 691中把 PER的編碼又分為 alig nedv ariant 和 unaligned v ariant 這兩種情況。其中,unalig ned va riant的編碼都是按比特來的,各個數據項的編碼之間沒有填充的比特,因此它比 alig nedv ariant更為精簡。但這種編碼的結果沒有從字節的邊界處開始,實現起來不方便,而且也將佔用更多的CPU時間。
[2]
與 BER編碼比較,PER編碼的精簡主要來自於以下三方面:
BER沒有T字段
BER長度段的編碼更加精簡
BER的長度段的編碼都是字節,而且 BER長度的編碼不考慮具體條件; 然而 PER的長度字段根據編碼類型的不同,有不同的單位。這些單位可以是比特、字節、元素、字符等。 這也是 PER利用數據結構已知的優勢來減少編碼量的又一方式;而且根據具體的條件限制,PER的長度段還可以大幅度削減,譬如當數據類型的長度固定時,該數據項的長度甚至可以不編碼。 IA5String ( SIZE( 4) ): : = “ BCDA”,由於長度固定為 4,PER編碼就只對 BCDA進行編碼,共 4字節。而 BER則還要包括 T和 L字段,共 6字節。