複製鏈接
請複製以下鏈接發送給好友

BER

(計算機術語)

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

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)輔助函數。
簡單數據類型的編碼函數為外部提供統一的 API 接口。信令轉換模塊利用這些函數對 TCAP 數據單元進行編碼和解碼,如果是複合類型,則分解成基本數據類型進行編碼解碼。 [1] 
編碼函數形式是:
int ASNEncode_< 數據類型> ( ASNCONTEXT* pCtx, < 數據類型對應的 C 結構> * pObj, int TagType) , 將 C 結構內的數據編碼到緩衝區中。
解碼函數形式是:
int ASNDecode_< 數據類型> ( ASNCONTEXT* pCtx, < 數據類型對應的 C 結構> * pObj, int TagType) , 將緩 衝區內的數據解碼到數據結構中。
內存函數主要是進行內存的分配和管理。
輔助函數主要是進行編 解碼錯誤的處理。 [1] 

BER數據結構

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

BER內存分配和管理

一般而言,C 語言中有下面兩種方法進行內存分配:( 1) 在棧上分配變量,然後將變量的地址傳給指針字段;( 2)使用標準的 malloc 和 free 兩個C 函數動態分配內存。第一種方法比較簡單,可以得到臨時內存,不再需要時可以釋放。但是,這樣很不安全,容易出現懸空指針。第二 種方法沒有這個問題,在調用完編碼函數後可以安全釋放每個元素的內存。但是,對每個malloc 調用都要有free 調用。對於複雜的結構,很難做到這點,可能會導致內存泄漏。 [1] 
採用的方法是使用庫內存管理函數進行分配和釋放內存緩衝區。相比第二種方法, 其最大的優點是隻需調用一個簡單的 MemFreeAll 函數就可以釋放所有分配的內存。具體做法是, 在上下文結構中跟蹤所有分配的內存, 當M emFreeAll 調用時,所有內存立刻釋放。另外,動態分配內存是從一小塊連續內存池中分配,同時由一個 MEM_POOL結構記錄內存池的起始地址、大小以及當前指針。最初,該指針指向內存池的開始處,分配內存時, 指針向前移動需要的長度。用這種方式分配的內存不會顯式地釋放,只有當指針重新設置為內存池的開始時才釋放。釋放的方法也很簡單,只要賦值操作就可完成。
BER 編碼是從緩衝區的結尾開始向前構造編碼,編碼完成後起始指針會落在緩衝區的中間。使用這樣的編碼技巧,可以方便地得到編碼後數據的起始地址和長度。 [1] 

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字段

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

BER長度段的編碼更加精簡

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

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

在對 Integer 等數字類型 (包括 Integ er和一些類型的長度值編碼的情況 )進行編碼時,BER採取的是直接對數值進行編碼;而 PER採取的是對數據的偏移值 ( offset)進行編碼。所謂偏移值就是實際值減去下界的值。Integer ( 123456789…123456792): : = 123456790,o ffset= 1,PER只需要對 1進行編碼,編碼結果為“ 01”,佔兩個比特。而PER就要對 1234567690進行編碼,編碼結果為包括 TLC三個字段共需要 6個字節。這樣對於那些下界類型很大的整數,可以節省大量字節,且編碼本身也非常簡潔。 [2] 
參考資料
  • 1.    餘鷹 , 範輝 , 見春蕾.基於BER的ASN1編解碼原理與設計實現:計算機工程與科學,2005 , 27 (1) :83-86
  • 2.    呂謙 , 黃本雄.ASN. 1及其兩種編碼方式 ( BER和 PER)的對比研究:數據通信,2001 (3):18-21